【问题标题】:TextWatcher called even if text is set before adding the watcher即使在添加观察者之前设置了文本,也会调用 TextWatcher
【发布时间】:2011-03-01 06:07:41
【问题描述】:

在一个 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 中设置文本之后添加的观察器。任何想法为什么会发生这种情况以及我如何防止这种情况发生?

【问题讨论】:

    标签: android textwatcher


    【解决方案1】:

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

    【讨论】:

    • 对我来说很方便(在片段中)检查“isResumed()”并且在这种情况下只响应 onTextChanged,似乎可以解决问题
    【解决方案2】:

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

    我认为这是因为您在 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)。

    【讨论】:

    • 并非如此。确实,它在第一次创建活动时就起作用了,但是 EditText 每次都是一个没有附加任何观察者的新实例。我简化了代码并为观察者添加了一个计数器:
    • 您是否将editText et 定义为静态?如果是的话,这可能是原因。正如你提到它第一次工作 f9,那么问题肯定是每次都没有创建 ediText 的新实例
    • 对不起,它在我完成之前更新了我的评论。我现在更新了上面的代码。我简化了它并为 TextWatcher 添加了一个计数器。您可以看到问题不是在第一次创建活动时出现,而是在第二次出现。但是,第二个 TextWatcher 实例被调用,而不是第一个。 EditText 也始终是一个没有附加任何观察者的新实例。和不; EditText 未定义为静态的。
    • "removeTextChangedListener" 在您定义的 EditText 下方使用此方法,然后尝试 2 setText。
    • 好的,我知道了。我太傻了!调用 TextWatcher 不是因为我设置的文本,而是因为在 onStart() 和 onResume() 方法之间的屏幕旋转后,android 本身也会恢复 EditText 中的文本。所以我必须在 onResume() 方法中添加观察者,这没有多大意义,但至少它可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多