我有一个情况,有两个领域。Field1和field2。我想要的
当field1被改变时,要做的是空field2,反之亦然。所以只有在最后
一个字段上有内容。
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field1.setText("");
}
});
它工作得很好,如果我附加addTextChangedListener到field1,但当
我对两个字段都这么做,应用程序崩溃了。显然是因为他们想要改变
无限地相互联系。一旦field1改变,此时它就会清除field2
Field2被更改,因此它将清除field1,以此类推……
谁能给点建议吗?
您可以添加一个检查,只在字段中的文本不为空时清除(即当长度不等于0时)。
field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(s.length() != 0)
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(s.length() != 0)
field1.setText("");
}
});
这里是TextWatcher的文档。
另外,请尊重命名约定。
我们可以在编辑文本之前删除字段的TextWatcher,然后在编辑文本之后将其添加回来。
将field1和field2的文本监视器声明为单独的变量,并为它们命名:例如field1
private TextWatcher Field_1_Watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
};
然后使用它的名称添加该监视程序:
field1. addtextchangedlistener (Field_1_Watcher)用于field1,和
field2. addtextchangedlistener (Field_2_Watcher)用于field2
在修改field2文本之前,删除TextWatcher:
field2.removeTextChangedListener (Field_2_Watcher)
修改文本:
field2.setText (" ")
然后将TextWatcher添加回来:
field2.addTextChangedListener (Field_2_Watcher)
对另一个字段做同样的处理
我知道这很旧了,但某天有人可能会再次看到它。
I had a similar problem where I would call setText on a EditText and onTextChanged would be called when I didn't want it to. My first solution was to write some code after calling setText() to undo the damage done by the listener. But that wasn't very elegant.
After doing some research and testing I discovered that using getText().clear() clears the text in much the same way as setText(""), but since it isn't setting the text the listener isn't called, so that solved my problem. I switched all my setText("") calls to getText().clear() and I didn't need the bandages anymore, so maybe that will solve your problem too.
试试这个:
Field1 = (EditText)findViewById(R.id.field1);
Field2 = (EditText)findViewById(R.id.field2);
Field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
Field2.getText().clear();
}
});
Field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
Field1.getText().clear();
}
});
我写了自己的扩展,对我很有帮助。(芬兰湾的科特林)
你可以这样写:
editText.customAfterTextChanged { editable ->
//You have accessed the editable object.
}
我的分机号:
fun EditText.customAfterTextChanged(action: (Editable?)-> Unit){
this.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun afterTextChanged(editable: Editable?) {
action(editable)
}
})}