TextWatcher事件被多次触发

Asa*_*afK 40 android android-layout textwatcher

我对TextWatcher有一个恼人的问题.我一直在网上搜索,但找不到任何东西.感谢有人能帮助我.

出于某种原因,在一次文本更改时对TextWatcher事件的调用是不稳定的.有时它们会被触发一次(就像它们应该的那样),有时是两次,有时是3次.不知道为什么,整件事情非常直截了当.有时候,afterTextChanged()上的Editable参数会返回toString()和length()中的空值.

代码如下:

    private TextWatcher mSearchAddressTextChangeListener = 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 searchedAddress) {
           System.out.println("called multiple times.");   
        }
    };
Run Code Online (Sandbox Code Playgroud)

内部afterTextChanged()(和AsyncTask)我没有对文本或EditText视图进行任何更改.

我看到在TextWatcher的事件中询问的问题被调用了两次,但我发现事件触发的次数多于(或少于)两次.

无论如何,感谢任何帮助.

编辑:我删除了afterTextChanged()的内容导致即使没有我的代码也会发生此问题.是什么让我相信这是一个错误.当在常规字符(事件处理程序被触发两次)之后输入'space'字符时或者在删除常规字符之后的'space'字符(退格.事件处理程序被触发3次)时,会发生错误.帮助仍将受到赞赏.

Nic*_*ico 54

我有同样的问题,当我在连续文本的末尾用光标按下退格键时,afterTextChange被调用3次: - 第一次使用正确的s值 - 第二次使用清除值 - 第三次使用再次正确的值

在网上搜索了很多之后,我尝试将EditText inputType更改为

android:inputType="textNoSuggestions"
Run Code Online (Sandbox Code Playgroud)

不要问我为什么,但它有效,afterTextChanged现在只调用一次.


Nei*_*end 7

根据TextWatcher的开发人员页面,如果对Editable内部进行了更改TextWatcher,则会触发对所有TextWatchers链接的进一步调用Editable.现在,显然您的代码不会触发此行为.

然而,这是很有可能的是,如果出于某种原因,该系统具有一TextWatcherEditable,可能会出现您所描述的情况."为什么",我听到你哭,"这应该发生吗?"

首先,经典防御:没有理由不发生,严格来说,应该编写应用程序代码以适应它.

其次,我无法证明这一点,但我可以想象处理显示文本布局的代码EditText使用a TextWatcher来处理更新屏幕上文本的显示.此代码可能会将控制代码(未显示)插入到该代码中Editable以确保良好的换行符等.它甚至可以循环几次以使其正确,并且您可能只有在完成所有操作后才能进行第一次调用...

编辑

根据@Learn OpenGL ES的评论,调用TextWatcher对于自动更正这样的事情是正常的.


M. *_*han 6

你可以使用布尔检查,例如:

    inputBoxNumberEt.addTextChangedListener(new TextWatcher() {

        boolean ignoreChange = false;

        @Override
        public void afterTextChanged(Editable s) {
        }

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

        @Override
        public void onTextChanged(CharSequence s, int start,
                                  int before, int count) {
            if (!ignoreChange) {
              ///Do your checks                    
                ignoreChange = true;
                inputBoxNumberEt.setText(string);
                inputBoxNumberEt.setSelection(inputBoxNumberEt.getText().length());
                ignoreChange = false;
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)


小智 5

boolean isOnTextChanged = false;

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

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    isOnTextChanged = true;
}

@Override
public void afterTextChanged(Editable quantity) {
    if (isOnTextChanged) {
        isOnTextChanged = false;
       //dosomething
    }
Run Code Online (Sandbox Code Playgroud)