in an android activity, i first recover the text in an EditText and add then a TextWatcher to it.
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());
}
});
}
but when i run the activity, the afterTextChanged method is called even if the Watcher itself is added after setting the text. so the log output is something like
onCreate: LifecycleMain Set text xyz // screen rotation onCreate: LifecycleMain Set text xyz afterTextChanged: xyz 2
the counter in the TextWatcher shows that the watcher that is called is the one that was added AFTER the text was set in the EditText. any ideas why that happens and how i can prevent that?
The TextWatcher interface can be used for listening in for changes in text in an EditText.
public class MyTextWatcher implements TextWatcher { private EditText editText; // Pass the EditText instance to TextWatcher by constructor public MyTextWatcher(EditText editText) { this. editText = editText; } @Override public void afterTextChanged(Editable e) { // Unregister self before update editText.
EditText is used for entering and modifying text. While using EditText width, we must specify its input type in inputType property of EditText which configures the keyboard according to input. EditText uses TextWatcher interface to watch change made over EditText.
Solution is to move your addTextChangedListener to onPostCreate method. all will be solved.
This definitely must be happening. You are setting text when savedinstanceState is not null (meaning your previous object states are saved).
I think that this happens because you added the TextWatcher to your EditText in the onCreate method, and next time onCreate gets called (e.g. after a configuration change) then it finds that the TextWatcher has already been added to the EditText.
If you want to check for this situation, put this before your condition:
if(savedInstanceState == null){
Log.e("savedInstance state is null", "no text");
et.setText("No text");
}
In this case, if you call setText on your EditText, then afterTextChanged(Editable s) will not be called.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With