Android TextWatcher不起作用

Android TextWatcher不起作用,android,textwatcher,Android,Textwatcher,以下代码段用于文本观察程序…它不工作…一切正常,直到最后一行代码 private TextWatcher mobileTextWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextC

以下代码段用于文本观察程序…它不工作…一切正常,直到最后一行代码

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。。或者换句话说,我在编辑文本中看不到文本的更改。

因为
s
是函数参数,您不能重新分配它并保存超出函数范围的新值


如果我正确理解您的目标-您应该通过
setText()
方法将temp值分配给
EditText
,参数不作为引用传递,因此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);
    }
};

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


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

您没有更改
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;
    }
}
注意,我添加了一些保护,以防止在更改
s
对象时调用
posterextchanged
(我假设该对象上放置了一个DataObserver)。递归保护已经超出了我的想象,因此可能需要调整


希望这会有帮助。

但这会导致无限循环…s.replace()是否可以达到目的?它工作正常…我的不好…请编辑您的答案,以便我可以投票