26

次のようなコード行を回避するにはどうすればよいですか。

((EditText) findViewById(R.id.MyEditText)).setText("Hello");

ここでイベントが発生します:

((EditText) findViewById(R.id.MyEditText)).addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
    int before, int count) {
// HERE
}

@Override
public void beforeTextChanged(CharSequence s, int start,
    int count, int after) {
}

@Override
public void afterTextChanged(Editable s) {
}
});

AutoCompleteTextView のドロップダウン結果を選択した場合に気づいたように、onTextChanged の実行を禁止する方法があるかどうかを知りたいです (onTextChanged は実行されません!)。

「こんにちは何もしない場合」のような回避策を探しているわけではありません...

4

6 に答える 6

27

AutoCompleteTextViewのソースは、ブール値を設定して、テキストがブロック補完に置き換えられていることを示しています。

         mBlockCompletion = true;
         replaceText(convertSelectionToString(selectedItem));
         mBlockCompletion = false;    

これは、やりたいことを達成するための良い方法です。次に、TextWatcherは、setText が完了を介して取得され、メソッドから戻るかどうかを確認します。

 void doBeforeTextChanged() {
     if (mBlockCompletion) return;

TextWatcher の追加と削除は、アプリケーションにとってより時間がかかります

于 2012-10-17T13:38:30.233 に答える
15

ユーザーとプログラムによってトリガーされたイベントを区別するために、現在どのビューにフォーカスがあるかを確認できます。

EditText myEditText = (EditText) findViewById(R.id.myEditText);

myEditText.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(myEditText.hasFocus()) {
            // is only executed if the EditText was directly changed by the user
        }
    }

    //...
});

その答えのより詳細なバージョンについては、こちらをご覧ください。

于 2015-10-12T20:49:30.313 に答える
5

mEditText.hasFocus()または、人間が変更したテキストとプログラムが変更したテキストを区別するために使用することもできます。これは私にとってはうまくいきます。

@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    if (mEditText.hasFocus()) {
        // Do whatever
    }
}

お役に立てれば!

于 2016-10-26T07:21:00.193 に答える
3

リスナーを無効にする簡単な方法はないと思いますが、次のいずれかで回避できます。

  • TextWatcherテキストを設定する前に削除し、後で追加し直します。
  • またはboolean、テキストを設定する前にフラグを設定して、テキストTextWatcherを無視するように指示します。

例えば

boolean ignoreNextTextChange = true;
((EditText) findViewById(R.id.MyEditText)).setText("Hello");

そしてあなたの中でTextWatcher

new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        /*
        If the flag is set to ignore the next text change,
        reset the flag, and return without doing anything.
        */
        if (ignoreNextTextChange){
            ignoreNextTextChange = false;
            return;
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

少しハッキーですが、うまくいくはずです:)

于 2012-10-16T04:26:45.157 に答える
3

これを実現する別の方法は、 を使用することsetOnKeyListenerです。

これは、EditText がユーザーまたはプログラムによって変更されたときではなく、ユーザーがキーを押したときにのみトリガーされます。

myEditText.setOnKeyListener(new EditText.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        switch(event.getAction()) {
            case KeyEvent.ACTION_DOWN:
                // beforeTextChanged
                break;      
            case KeyEvent.ACTION_UP:
                // afterTextChanged
                break;
        }
        return false;
    }
});
于 2014-06-03T15:04:42.433 に答える
0

私が見ることができる唯一の2つの方法

  • リスナー内でチェックします
  • 特定の条件に従ってリスナーを追加/削除します

最初の方法は望ましくない回避策であるため、2 番目の方法で回避することをお勧めします。

于 2012-10-16T04:40:40.243 に答える