8

在一个 android 活动中,我首先恢复 EditText 中的文本,然后向其中添加一个 TextWatcher。

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());
    }
});
}

但是当我运行活动时,即使在设置文本后添加了 Watcher 本身,也会调用 afterTextChanged 方法。所以日志输出类似于

onCreate: LifecycleMain
设置文本 xyz
// 屏幕旋转
onCreate: LifecycleMain
设置文本 xyz
afterTextChanged: xyz 2

TextWatcher 中的计数器显示被调用的观察者是在 EditText 中设置文本之后添加的观察者。任何想法为什么会发生这种情况以及我如何防止这种情况发生?

4

2 回答 2

8

解决方案是将您的 addTextChangedListener 移动到 onPostCreate 方法。一切都会得到解决。

于 2011-05-25T05:11:59.233 回答
1

这肯定会发生。当 savedinstanceState 不为空时,您正在设置文本(这意味着您之前的对象状态已保存)。

我认为这是因为您在 onCreate 方法中将 TextWatcher 添加到 EditText 中,并且下次调用 onCreate 时(例如,在配置更改之后)然后它发现 TextWatcher 已经添加到 EditText 中。

如果您想检查这种情况,请将其放在您的条件之前:

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

在这种情况下,如果您在 EditText 上调用 setText,则不会调用 afterTextChanged(Editable s)。

于 2011-03-01T06:30:44.613 回答