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

meh*_*meh 20 android android-edittext

我有一个片段与EditText和里面的onCreateView()我添加TextWatcherEditText.

每次第二次添加片段时,都会afterTextChanged(Editable 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

meh*_*meh 48

编辑解决方案:

因为看起来文本是从第二次连接片段时改变的,因为片段恢复了先前的视图状态.

我的溶液加入text watcheronResume()自恢复状态之前onResume被调用.

@Override
public void onResume() {
    super.onResume();
    myEditText.addTextChangedListener(textWatcher);
}
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案也不理想。现在,每次您的片段出现在前台时,都会重新添加`textWatcher`,最终您将在`myEditText`中获得多个观察者引用。每次修改文本后,这都会导致两次调用afterTextChanged()方法。请参阅框架中的“ TextView.addTextChangedListener”源。 (2认同)
  • 我认为您应该在 Fragment 的 onViewCreated 中添加 addTextChangedListener (2认同)

z3n*_*105 5

这个错误似乎来自这样一个事实,即当视图再次活跃时,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" />
Run Code Online (Sandbox Code Playgroud)

因此,通过添加 android:saveEnabled="false"您的 EditText 将解决该问题,并且当视图出现在前台时将不会调用 setText。

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