Android 在没有实际更改文本的情况下调用afterTextChanged()回调

Android 在没有实际更改文本的情况下调用afterTextChanged()回调,android,android-edittext,Android,Android Edittext,我有一个带有EditText的片段,在onCreateView()中我向EditText添加了一个TextWatcher 每次第二次添加片段时,afterTextChanged(可编辑的s)将调用回调,而不会更改文本 以下是一段代码片段: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... myEditText =

我有一个带有
EditText
的片段,在
onCreateView()中我向
EditText
添加了一个
TextWatcher

每次第二次添加片段时,
afterTextChanged(可编辑的s)
将调用回调,而不会更改文本

以下是一段代码片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
    myEditText = (EditText) v.findViewById(R.id.edit_text);
    myEditText.addTextChangedListener(textWatcher);
...
}

TextWatcher textWatcher = new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        searchProgressBar.setVisibility(View.INVISIBLE);
    }

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

    }

    @Override
    public void afterTextChanged(Editable s) {
        Log.d(TAG, "after text changed");
    }
}

我还将片段设置为保留其状态,并将片段的实例保留在活动中。

已编辑的解决方案:

由于片段恢复了视图的先前状态,因此从第二次附加片段时起,文本似乎发生了更改

我的解决方案是在
onResume()
中添加
text watcher
,因为在调用
onResume
之前状态已还原

@Override
public void onResume() {
    super.onResume();
    myEditText.addTextChangedListener(textWatcher);
}
编辑 正如@MiloszTylenda在评论中提到的,最好删除
onPause()
回调中的
Textwatcher
,以避免泄漏
Textwatcher

@Override public void onPause() {
  super.onPause();
  myEditText.removeTextChangedListener(watcher);
}

这个错误似乎来自这样一个事实:当视图再次激活时,Android SDK将调用settext来恢复EditText的状态。 正如您从下面的摘录中看到的,您可以在Edittext上更改一个标志以绕过此行为

    <!-- If false, no state will be saved for this view when it is being
         frozen. The default is true, allowing the view to be saved
         (however it also must have an ID assigned to it for its
         state to be saved).  Setting this to false only disables the
         state for this view, not for its children which may still
         be saved. -->
    <attr name="saveEnabled" format="boolean" />

因此,通过在EditText上添加
android:saveEnabled=“false”
可以解决这个问题,并且当视图进入前台时,不会调用setText


这就是我所做的,问题得到了解决。

每次第二次添加片段时,您可以分享一些与此相关的代码吗?切换片段时,这是一件非常常见的事情。事务.replace(r.id.container,fragment);commit();没什么特别的,我已经解决了添加一个标志的问题,我将发布一个解决方案。太好了,这为我解决了它!非常感谢。这简直让我发疯。这个解决方案也不理想。现在,每当你的片段出现在前台时,
textWatcher
就会被重新添加,你最终会在
myEditText
中看到多个观察者引用。这会导致在每次文本修改后调用两次
PostTextChanged()
方法。请参阅框架中
TextView.addTextChangedListener
的源代码。@MiloszTylenda因此正确的答案是在onPause期间删除文本监视程序。我会编辑答案!谢谢。我想你应该在片段的onViewCreated中添加addTextChangedListener