【发布时间】:2012-03-31 03:57:45
【问题描述】:
我有一个 Android 编程问题。使用下面的代码,我想验证字符串匹配。它验证得很好,但 LogCat 显示 TextWatcher 方法每次击键都会触发两次,我不知道为什么。我希望每次击键只触发一次。
你知道它为什么这样做吗?
我认为这可能是因为我更改了文本的颜色,但在将其注释掉后并没有什么不同。
LogCat 输出
03-31 03:37:25.269: I/BeforeText(676): Hit
03-31 03:37:25.269: I/OnText(676): Hit
03-31 03:37:25.269: I/AfterText(676): Hit
03-31 03:37:25.274: I/InvalidText(676): Incorrect Text.
03-31 03:37:25.274: I/Text Value(676): a
03-31 03:37:25.404: I/BeforeText(676): Hit
03-31 03:37:25.404: I/OnText(676): Hit
03-31 03:37:25.404: I/AfterText(676): Hit
03-31 03:37:25.404: I/InvalidText(676): Incorrect Text.
03-31 03:37:25.404: I/Text Value(676): a
活动代码
public void onCreate(Bundle savedInstanceState) {
//...omitted
//Create Answer Field
textField = (EditText)this.findViewById(R.id.textField);
//Add validation to TextField
textField.addTextChangedListener(new TextWatcher(){
public void afterTextChanged(Editable s){
Log.i("AfterText","Hit");
if(textField.getText().toString().trim().equalsIgnoreCase("hello")){
Log.i("ValidText", "Text matched.");
answerField.setTextColor(Color.GREEN);
}
else{
Log.i("InvalidText", "Incorrect text.");
Log.i("Text Value", textField.getText().toString());
textField.setTextColor(Color.RED);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
//Do nothing
Log.i("BeforeText", "Hit");
}
public void onTextChanged(CharSequence s, int start, int before, int count){
//Do nothing
Log.i("OnText","Hit");
}
});
}
【问题讨论】:
-
通过比较
s.toString().trim().equalsIgnoreCase("hello")等字符序列来检查。 -
我有同样的问题,我想我找到了它的来源,但是......我仍然没有解决方案。就我而言,似乎当您点击空格时会创建一个新的跨度,这似乎会触发两个事件。如果您尝试将编辑文本从“a b”更改为“a”,您将看到下一个错误日志:E/SpannableStringBuilder(24004): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
标签: android textwatcher