afterTextChanged() callback being called without the text being actually changed

前端 未结 2 1056
Happy的楠姐
Happy的楠姐 2021-01-07 17:36

I have a fragment with an EditText and inside the onCreateView() I add a TextWatcher to the EditText.

Each time t

相关标签:
2条回答
  • 2021-01-07 18:02

    Edited solution:

    As it seems the text was changed from the second time the fragment was attached because the fragment restored the previous state of the views.

    My solution was adding the text watcher in the onResume() since the state was restored before the onResume was called.

    @Override
    public void onResume() {
        super.onResume();
        myEditText.addTextChangedListener(textWatcher);
    }
    

    Edit As @MiloszTylenda have mentioned in the comments it is better to remove the Textwatcher in the onPause() callback to avoid leaking the Textwatcher.

    @Override public void onPause() {
      super.onPause();
      myEditText.removeTextChangedListener(watcher);
    }
    
    0 讨论(0)
  • 2021-01-07 18:04

    It seems that this error comes from the fact that Android SDK will call settext when view is coming alive again to recover the state of the EditText. As you can see from the extract below there is a flag that you can change on the Edittext to bypass this behavior.

        <!-- 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" />
    

    So by adding android:saveEnabled="false" on your EditText will fix the problem and the setText will not be called when view comes to foreground.

    This is what I did and problem was solved.

    0 讨论(0)
提交回复
热议问题