Android アクティビティでは、最初に EditText のテキストを復元し、TextWatcher を追加します。
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());
}
});
}
しかし、アクティビティを実行すると、テキストを設定した後にウォッチャー自体が追加されても、afterTextChanged メソッドが呼び出されます。ログ出力は次のようになります
onCreate: ライフサイクルメイン テキストの設定 xyz // 画面の回転 onCreate: ライフサイクルメイン テキストの設定 xyz afterTextChanged: xyz 2
TextWatcher のカウンターは、呼び出されたウォッチャーが、テキストが EditText に設定された後に追加されたものであることを示しています。なぜそれが起こるのか、どうすればそれを防ぐことができるのでしょうか?