我有一个情况,其中有两个字段。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
,依此类推……
有人能给出什么解决方案吗?
发布于 2013-12-29 19:28:11
您可以添加复选标记,仅当字段中的文本不为空时(即长度不为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
here的文档。
也请尊重naming conventions。
发布于 2016-07-16 10:38:20
我知道这很古老,但总有一天会有人再遇到它。
我遇到过一个类似的问题,我会在EditText上调用setText,当我不想调用onTextChanged时,它会被调用。我的第一个解决方案是在调用setText()之后编写一些代码来消除侦听器造成的破坏。但这并不是很优雅。在做了一些研究和测试后,我发现使用getText().clear()清除文本的方式与使用setText("")的方式很相似,但由于它没有设置文本,所以不会调用侦听器,所以我的问题就解决了。我把我所有的setText("")调用都切换到了getText().clear(),我不再需要胶布了,所以也许这也能解决你的问题。
试试这个:
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();
}
});
发布于 2018-06-25 15:04:56
如果你使用Kotlin进行Android开发,那么你可以使用以下代码添加TextChangedListener()
:
myTextField.addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
})
https://stackoverflow.com/questions/20824634
复制相似问题