在 EditText 中输入 Return 键时,TextWatcher 运行多次

TextWatcher runs multiple times on entering Return Key in EditText

我有一个带 TextWatcher 的 EditText。


场景一:

EditText 包含“abcd

如果我按 return 键或输入换行符

1) 在字符之前,TextWatcher 触发 3 次。

2) 在字符之间,TextWatcher 触发 4 次。

3) 在字符的末尾,TextWatcher 触发 1 次。


场景二:

EditText 包含“1234

如果我按 return 键或输入换行符

1) 在字符之前,TextWatcher 触发 1 次。

2) 在字符之间,TextWatcher 触发 1 次。

3) 在字符的末尾,TextWatcher 触发 1 次。


这是一个错误吗?

或者有什么不明白的吗?


我希望文本观察器在所有场景中只触发一次。

任何帮助将不胜感激。

这是因为数字被计为单个值,即数字 1 或 12 "twelve" 而不是 1,2。相反,当您输入单词 "Strings" 时,它们会被分成字符,并且整个字符串中字符的总数将返回到 textWatcher 重载方法的计数参数中。

例如,如果您输入 123,它将被解释为单个值 123。因此计数返回为 1。当您输入 hello 时,它被分成单独的字符,即 'h'、'e'、'l'、'l'、'o'算作总共 5 个字符。因此返回的总计数为 5。

希望这个解释对您有所帮助。

我找到了解决方案,但可能无法满足所有需求。

之前,当TextWatcher被触发多次,其中的代码也被执行多次,我在

editText.addTextChangedListener(new TextWatcher() {

    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

        Log.e(TAG, "111 text =---------------" + charSequence);
    }

    public void onTextChanged(CharSequence charSequence, int start, int before, int count){

        Log.e(TAG, "222 text =---------------" + charSequence);
    }

    public void afterTextChanged(Editable editable) {

        Log.e(TAG, "333 text ---------------" + editable);
    }
});

现在,根据我的要求,我找到了解决方案,我与

editText.addTextChangedListener(new TextWatcher() {

    String initialText = "";
    private boolean ignore = true;

    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

        if ( initialText.length() < charSequence.length() ){

            initialText = charSequence.toString();
            Log.e(TAG, "111 text ---------------" + charSequence);
        }
    }

    public void onTextChanged(CharSequence charSequence, int start, int before, int count){

        if( initialText.length() < charSequence.length() ) {

            initialText="";
            ignore=false;
            Log.e(TAG, "222 text ---------------" + charSequence);
        }
    }

    public void afterTextChanged(Editable editable) {

        if(!ignore) {

            ignore = true;
            Log.e(TAG, "333 text ---------------" + editable);
        }
    }
});

现在 TextWatcher 多次触发 但是 if 条件中的代码只执行一次 我在问题中提到的场景。