2011-08-04 7 views
0

私はアンドロイドアプリケーションで2 editText objecstを持っています。私はそのようなロジックに書き込むので、textField 1に何かを入力すると、同じものを実行時にTextfield 2に複製する必要があります。逆もまた同様です。AndroidのEditText間でデータを交換する

例:フィールド1に「a」と入力すると、フィールド2にも「a」が表示されます。フィールド2に "b"と入力すると、フィールドも "b"に変更されます。

私は1から2または2から1の同じ方法を達成できますが、同時にはできません。私はTF2のための別のリスナーを書き、TF1でテキストを設定

final EditText tf1 = (EditText)findViewById(R.id.editText1); 
final EditText tf2 = (EditText)findViewById(R.id.editText2); 

tf1.setOnFocusChangeListener(new View.OnFocusChangeListener() 
{ 
    public void onFocusChange(View v, boolean hasFocus) 
    { 
     if (hasFocus) 
     { 
      tf1.addTextChangedListener(new TextWatcher() 
      { 
       public void afterTextChanged(Editable s) {tf2.setText(s);} 
      } 
     } 
    } 
}; 

同様の方法:以下は、私が書いたコードです。このシナリオをどのように処理できるのかを助けてください。

答えて

1

あなたの答えはほぼあります。重要なのは、フォーカスが失われた場合、いずれかのEditTextフィールドのtextChangedListenerを削除することです。次に、どのEditTextフィールドに現在リスナーがあるかを追跡し、それに応じて他のものを更新します。ここでは、あなたが探しているものを達成する必要があり、簡単な活動です:

public class EditTextActivity extends Activity implements TextWatcher { 

    private EditText mEditText1; 
    private EditText mEditText2; 
    private int mEditTextWatcherNum = 1; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mEditText1 = (EditText) findViewById(R.id.editText1); 
     mEditText2 = (EditText) findViewById(R.id.editText2); 

     mEditText1.addTextChangedListener(this); 
     mEditText1.setOnFocusChangeListener(new OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (hasFocus) { 
        mEditText1.addTextChangedListener(EditTextActivity.this); 
        mEditTextWatcherNum = 1; 

       } else { 
        mEditText1.removeTextChangedListener(EditTextActivity.this); 
       } 
      } 
     }); 

     mEditText2.setOnFocusChangeListener(new OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (hasFocus) { 
        mEditText2.addTextChangedListener(EditTextActivity.this); 
        mEditTextWatcherNum = 2; 

       } else { 
        mEditText2.removeTextChangedListener(EditTextActivity.this); 
       } 
      } 
     }); 


    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     switch (mEditTextWatcherNum) { 
     case 1: 
      mEditText2.setText(s); 
      break; 
     case 2: 
      mEditText1.setText(s); 
      break; 
     default: 
      break; 
     } 

    } 

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

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     //Do Nothing 

    } 

} 
+0

これは、しかし、私は(この)mEditText1.addTextChangedListenerコメントそよ風:)のように働きました。いくつかのケースでエラーを投げていたので。私はそれが最初のフィールドのためにlisternerを常に保ったと信じています。おかげさまで助けになりました – Somak

0

変更されたテキストを削除しないと、フォーカスが失われたTextViewからリスナーが変更されますか?これは、あなたのアプリが無限ループに入り、両方ともTextViewを継続的に更新するのを防ぎます。

0

最初の編集テキストのテキストを設定するときに、グローバル変数を使用して前の値を保存します。次に、2番目の編集テキストのテキストを設定するときは、グローバル変数の値を使用します。

関連する問題