我有一个带TextWatcher的EditText。
情景1:
包含“ abcd ”
的EditText如果按回车键或输入换行符
1)在角色之前,TextWatcher
会发射3次。
2)在角色之间,TextWatcher
发射4次。
3)在角色的末尾,TextWatcher
发射一次。
情景2:
包含“ 1234 ”
的EditText如果按回车键或输入换行符
1)在角色之前,TextWatcher
发射1次。
2)在角色之间,TextWatcher
发射1次。
3)在角色的末尾,TextWatcher
发射一次。
这是一个错误吗?
或者有什么我不理解的东西?
我希望文本观察者只针对所有场景触发一次。
任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
我找到了解决方案但可能并不适合所有需求。
早些时候,当TextWatcher
多次触发并且其中的代码也被多次执行时,我还是
editText.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
Log.e(TAG, "111 text =---------------" + charSequence);
}
public void onTextChanged(CharSequence charSequence, int start, int before, int count){
Log.e(TAG, "222 text =---------------" + charSequence);
}
public void afterTextChanged(Editable editable) {
Log.e(TAG, "333 text ---------------" + editable);
}
});
现在,根据我的要求,我找到了解决方案,我和
editText.addTextChangedListener(new TextWatcher() {
String initialText = "";
private boolean ignore = true;
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
if ( initialText.length() < charSequence.length() ){
initialText = charSequence.toString();
Log.e(TAG, "111 text ---------------" + charSequence);
}
}
public void onTextChanged(CharSequence charSequence, int start, int before, int count){
if( initialText.length() < charSequence.length() ) {
initialText="";
ignore=false;
Log.e(TAG, "222 text ---------------" + charSequence);
}
}
public void afterTextChanged(Editable editable) {
if(!ignore) {
ignore = true;
Log.e(TAG, "333 text ---------------" + editable);
}
}
});
现在TextWatcher
多次触发,但中的代码如果条件只执行一次,我在我的问题中提到的所有场景。
答案 1 :(得分:0)
这是因为数字被计为单个值,即数字1或12“十二”而不是1,2。相反,当您输入单词“Strings”时,它们被分成字符,整个字符串中的字符总数将在textWatcher的重载方法的count参数中返回。
例如,如果输入123,它将被解释为单个值123。因此,计数返回为1.当你输入hello时,它被分成单个字符,即'h','e','l','l','o',它们总计5个字符。因此,总计数返回为5。
希望这个解释有所帮助。