afterTextChanged() callback being called without the text being actually changed
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);
}
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.