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

时间:2017-07-25 07:09:48

标签: java android android-edittext textwatcher

我有一个带TextWatcher的EditText。

情景1:

包含“ abcd

的EditText

如果按回车键或输入换行符

1)在角色之前,TextWatcher会发射3次。

2)在角色之间,TextWatcher发射4次。

3)在角色的末尾,TextWatcher发射一次。

情景2:

包含“ 1234

的EditText

如果按回车键或输入换行符

1)在角色之前,TextWatcher发射1次。

2)在角色之间,TextWatcher发射1次。

3)在角色的末尾,TextWatcher发射一次。

这是一个错误吗?

或者有什么我不理解的东西?

我希望文本观察者只针对所有场景触发一次。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

我找到了解决方案但可能并不适合所有需求。

早些时候,当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 多次触发,但中的代码如果条件只执行一次,我在我的问题中提到的所有场景。

答案 1 :(得分:0)

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

例如,如果输入123,它将被解释为单个值123。因此,计数返回为1.当你输入hello时,它被分成单个字符,即'h','e','l','l','o',它们总计5个字符。因此,总计数返回为5。

希望这个解释有所帮助。