我试图制作两个EditText,在其中一个编辑文本中键入任何内容,我键入的文本将显示在另一个EditText上。
private EditText input_a;
private EditText input_b;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input_a = (EditText) findViewById(R.id.input_a);
input_b = (EditText) findViewById(R.id.input_b);
input_a.setOnFocusChangeListener(this);
input_b.setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View v,boolean hasFocus) {
// TODO Auto-generated method stub
if(v==input_a && hasFocus){
input_a.setText("");
input_b.setText("");
input_a.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
input_b.setText(input_a.getText());
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
// TODO Auto-generated method stub
}
});
}else if(v==input_b && hasFocus){
input_b.setText("");
input_a.setText("");
input_b.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
input_a.setText(input_b.getText());
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
// TODO Auto-generated method stub
}
});
}
因此,当我输入input_a时,它工作正常,输入的文本显示在input_b中,但是,当我输入input_b时,应用程序意外关闭。我不明白为什么这两个代码块实际上是相似的,但是只有其中一个起作用。
最佳答案
您可能会出现堆栈溢出(不是讽刺意味的)吗?
问题在于,当input_a获得焦点时,您将添加一个TextChangedListener,并在该侦听器中设置input_b的内容。这样很好。
但是,当焦点更改为input_b时,可以将textChangedListener添加到input_b,但仍然具有input_a的TextChangedListener。现在,当您键入input_b时,它将更改input_a的内容,从而触发其TextChangeListener,从而更改input_b的内容。这将触发input_b的TextChangedListener,您只需继续此循环即可。