TextWatcher called even if text is set before adding the watcher

落爺英雄遲暮 提交于 2019-11-28 08:13:07

问题


in an android activity, i first recover the text in an EditText and add then a TextWatcher to it.

private static int WC = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("TextWatcherTest", "onCreate:\t" +CLASS_NAME);
setContentView(R.layout.main);

EditText et = (EditText)findViewById(R.id.editText);
Log.e("TextWatcherTest", "Set text xyz");
et.setText("xyz");

et.addTextChangedListener(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) {
        Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString());
    }
});
}

but when i run the activity, the afterTextChanged method is called even if the Watcher itself is added after setting the text. so the log output is something like

onCreate:    LifecycleMain
Set text xyz
// screen rotation
onCreate:    LifecycleMain
Set text xyz
afterTextChanged:    xyz    2

the counter in the TextWatcher shows that the watcher that is called is the one that was added AFTER the text was set in the EditText. any ideas why that happens and how i can prevent that?


回答1:


Solution is to move your addTextChangedListener to onPostCreate method. all will be solved.




回答2:


This definitely must be happening. You are setting text when savedinstanceState is not null (meaning your previous object states are saved).

I think that this happens because you added the TextWatcher to your EditText in the onCreate method, and next time onCreate gets called (e.g. after a configuration change) then it finds that the TextWatcher has already been added to the EditText.

If you want to check for this situation, put this before your condition:

if(savedInstanceState == null){
    Log.e("savedInstance state is null", "no text");
    et.setText("No text");
}

In this case, if you call setText on your EditText, then afterTextChanged(Editable s) will not be called.



来源:https://stackoverflow.com/questions/5151095/textwatcher-called-even-if-text-is-set-before-adding-the-watcher

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!