我的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中设置了文本。请帮助说明如何处理这种情况
答案 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)
在为第一个编辑文本设置文本时,使用全局变量存储上一个值。然后,在第二个编辑文本中设置文本时,请使用全局变量中的值。