Android 在PostTextChanged()方法中键入字符时TextWatcher获取循环

Android 在PostTextChanged()方法中键入字符时TextWatcher获取循环,android,Android,我有一个EditText,我想当用户键入除以外的非数字字符时,EditText删除该字符,例如,我希望EditText接受如下文本:5451565897545 当用户输入非数字字符如454d54时,“d”字符被删除,只有45454保留在编辑文本中。 我的代码如下: editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSeque

我有一个EditText,我想当用户键入除
以外的非数字字符时,
EditText删除该字符
,例如,我希望EditText接受如下文本:5451565897545
当用户输入非数字字符如454d54时,“d”字符被删除,只有45454保留在编辑文本中。 我的代码如下:

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int count, int after) {

        }

        @Override
        public void afterTextChanged(Editable editable) {

           // Toast.makeText(getApplicationContext(),editable.toString(),Toast.LENGTH_LONG).show();
            editTextChecker(editable);
        }
    });

private void editTextChecker(Editable editable){
    String st=editable.toString();
    String regex="[\\D&&[^,]]";
    Pattern p=Pattern.compile(regex);
    Matcher m=p.matcher(st);
    String retSt=st;
    if (st.length()>0) {
        if (m.find()) {
            retSt = m.replaceAll("");
        }
        editable.replace(0, st.length(), retSt);
    }
}

但当我输入一个数字字符时,textWatcher得到无限循环

您可以如下设置digits xml属性,只接受数字和“,”作为编辑文本

<EditText
android:id="@+id/myNumber"
android:digits="0123456789,"
/>

只需像这样更改您的方法

private void editTextChecker(Editable editable) {
    String st = editable.toString();
    String regex = "[\\D&&[^,]]";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(st);
    String retSt = st;
    if (st.length() > 0 && m.find()) {
        retSt = m.replaceAll("");
        editable.replace(0, st.length(), retSt);
    }
}

每次有数字时,它都会调用afterTextChanged,因此它会导致无限循环,因此会更改条件

谢谢,在这种情况下,它非常好,适合我,但是如果我想在另一种情况下控制用户的类型,例如使用“;”分割数字或者,当我不想输入某个字符时,用户无法键入我正在执行的操作?如果您知道应该允许哪些字符编辑文本,则可以在“数字”属性中指定它们。如果你想要一个特殊的模式,你可以使用正则表达式检查编辑文本。是的,这是一个好主意,它的工作,但只是不设置inputType。