在Android中的EditText之间交换数据

时间:2011-08-04 19:19:45

标签: android android-edittext listener

我的android应用程序中有2 editText个目标。我想写这样的逻辑,这样如果我在textField 1中键入内容,那么同样应该在运行时在Textfield 2中复制,反之亦然。

示例:如果我在field1中键入“a”,则field2也将具有“a”。如果我在field2中键入“b”,则字段也应更改为“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 个答案:

答案 0 :(得分: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

    }

}

答案 1 :(得分:0)

您是否应该从失去焦点的TextView中删除文本更改的侦听器?这将阻止您的应用进入无限循环并持续更新TextView

答案 2 :(得分:0)

在为第一个编辑文本设置文本时,使用全局变量存储上一个值。然后,在第二个编辑文本中设置文本时,请使用全局变量中的值。