8

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 に設定された後に追加されたものであることを示しています。なぜそれが起こるのか、どうすればそれを防ぐことができるのでしょうか?

4

2 に答える 2

8

解決策は、addTextChangedListener を onPostCreate メソッドに移動することです。すべて解決します。

于 2011-05-25T05:11:59.233 に答える
1

これは間違いなく起こっているに違いありません。savedinstanceStateがnullでない場合(つまり、以前のオブジェクトの状態が保存されている場合)にテキストを設定しています。

これは、onCreateメソッドでEditTextにTextWatcherを追加し、次にonCreateが呼び出されたとき(構成の変更後など)に、TextWatcherがすでにEditTextに追加されていることを検出したために発生すると思います。

この状況を確認したい場合は、これを条件の前に置いてください。

if(savedInstanceState == null){
    Log.e("savedInstance state is null", "no text");
    et.setText("No text");
}

この場合、EditTextでsetTextを呼び出すと、afterTextChanged(Editable s)は呼び出されません。

于 2011-03-01T06:30:44.613 に答える