-1

以下代码片段用于文本观察器...它不起作用...一切正常,直到最后一行代码...

private TextWatcher mobileTextWatcher = new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        String number = s.toString();
        number = AppConstants.convertToOnlyDigits(number);
        Editable temp = new SpannableStringBuilder(
                AppConstants.formatPhoneNumber(number));
        s = temp;
    }
};

之后,新的不会分配给 s.. 或者换句话说,我看不到编辑文本中文本的变化。

4

4 回答 4

0

s函数参数一样,您不能重新分配它并保存超出函数范围的新值。

如果我理解你的目标正确 - 你应该EditText通过setText()方法分配 temp 值

于 2013-01-30T10:33:34.470 回答
0

参数不作为引用传递,所以 s = temp; 不会更改edittext中的文本。

像这样试试

private TextWatcher mobileTextWatcher       =   new TextWatcher() {
        boolean inWatcher = false;
        @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,int after) {
    }
    @Override
    public void afterTextChanged(Editable s) {
        if(inWatcher) { inWatcher = false; return; }
        String number   =   s.toString();
        number          =   AppConstants.convertToOnlyDigits(number);
        Editable temp   =   new SpannableStringBuilder(AppConstants.formatPhoneNumber(number));
        inWatcher = true;
        your_edit_text.setText(temp);
    }
};
于 2013-01-30T10:33:39.520 回答
0

您实际上必须使用 setText() 方法再次设置 EditText 的文本。

在执行此操作之前,您可能需要添加一个简单的布尔检查作为“mFormatting”,以确保在进行更改后不会进入 textWatcher 调用自身的无限循环。

于 2013-01-30T10:34:04.747 回答
0

您没有更改 中的对象s,而是将变量替换为s另一个对象。

尝试这样的事情:

boolean recurseProtection = false;
@Override
public void afterTextChanged(Editable s) { 
    if(!recurseProtection) {
        String number = s.toString();
        number = AppConstants.convertToOnlyDigits(number);
        recurseProtection = true;
        s.clear();
        s.append(AppConstants.formatPhoneNumber(number));
        recurseProtection = false;
    }
}

请注意,我添加了一些保护以afterTextChanged在您更改s对象时停止被调用(我假设它上面放置了一个 DataObserver)。递归保护不在我的脑海中,所以可能需要调整。

希望这可以帮助。

于 2013-01-30T10:37:07.127 回答