0

PC では、JTextField に onKeyListener を追加して keyReleased イベントをリッスンできます。Android では addTextChangedListener を使用しました。

私の Android アプリケーションには 2 つの EditText フィールドがあります。一方を編集すると他方に影響します。これにより、プログラムはスタック オーバーフロー エラーで失敗します。

EditText フィールドの変更ではなく、電話のキーボードをリッスンするにはどうすればよいですか? リスナーが原因で無限ループが発生するため、プログラムでリスナーを呼び出したくありません。

4

2 に答える 2

5

onFocusChangedListener をアタッチし、EditText にフォーカスがある場合は TextChangedListener を追加し、フォーカスを失った場合は削除します。このようなもの:

 EditText1.setOnFocusChangeListener(new OnFocusChangeListener() {

                public void onFocusChange(View v, boolean hasFocus) {
                    if(hasFocus){
                        ((EditText) v).addTextChangedListener(new TextWatcher() {

                        public void onTextChanged(CharSequence s, int start, int before, int count) {
                             //

                        }

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

                        }

                        public void afterTextChanged(Editable s) {
                            // affect EditText2

                        }
                    });

                }
                if(!hasFocus){
                    ((EditText) v).removeTextChangedListener();
                }
            }
        });

        }
    });

EditText2 も同様

于 2012-09-18T13:33:04.007 に答える
1

まず、テキスト変更リスナーを 1 つ作成SynchronizingWatcherし、両方にアタッチしEditTextます。次に、テキスト変更イベントを受け取ったら、他のテキスト編集を更新する前に、古いリスナーを登録解除し、テキストを更新して、リスナーを再度有効にします。

class SynchronizingWatcher implements TextWatcher {
  Set<EditText> synchronizedViews = new HashSet<EditText>();

  public void watchView(EditText view) {
    view.addTextChangedListener(this);
    synchronizedViews.add(view);
  }

  public void afterTextChanged(Editable s) {
    for (EditText editText : synchronizedViews) {
      editText.removeTextChangeListener(this);
      editText.setText(s);  // Of course you can do something more complicated here.
      editText.addTextChangeListener(this);
    }
  }

  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // Don't care.
  }

  public void onTextChanged(CharSequence s, int start, int before, int count) {
    // Don't care.
  }
}

...
// Somewhere in your activity:
SyncrhonizingWatcher synchronizingWatcher = new SynchronizingWatcher();
synchronizingWatcher.watchView(myEditText1);
synchronizingWatcher.watchView(myEditText1);

別の解決策:既存のKeyListenerものをデコレートする独自のものを提供しますKeyListener(既存のキーリスナーを取得しeditText.getKeyListener()、デコレータを で設定できますeditText.setKeyListener()。デコレータは の他の編集テキストも更新しonKeyUp()ます。しかし、私はそのようなものをいじらないようにします.

于 2012-09-18T00:28:42.493 に答える