Обмен данными между EditText в Android - PullRequest
0 голосов
/ 04 августа 2011

У меня есть 2 editText objecst в моем приложении для Android.Я хочу написать такую ​​логику, чтобы, если я наберу что-то в textField 1, то же самое должно быть воспроизведено в Textfield 2 во время выполнения и наоборот.

Пример: если я введу «a» в поле field1, поле field2 также будет иметь значение «a».Если я введу «b» в поле «field2», поле также должно измениться на «b»

. Я могу достичь одного и того же способа, т.е. от 1 до 2 или от 2 до 1, но не одновременно.Ниже приведен код, который я написал:

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);}
           } 
        }
     }  
};

Подобным образом я написал другой слушатель для tf2 и установил текст в tf1.Пожалуйста, помогите, как этот сценарий может быть обработан

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Ваш ответ почти там. Ключевым моментом здесь является удаление textChangedListener для любого из полей EditText, если оно теряет фокус. Затем проследите, какое поле 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 голосов
/ 04 августа 2011

Используйте глобальную переменную для сохранения предыдущего значения при настройке текста для первого текста редактирования.Затем при задании текста во втором тексте редактирования используйте значение в глобальной переменной.

0 голосов
/ 04 августа 2011

Не следует ли удалить текст измененного слушателя из TextView, который теряет фокус? Это не позволит вашему приложению войти в бесконечный цикл и постоянно обновлять оба TextView.

...