在 EditText 中输入 Return 键时,TextWatcher 运行多次
TextWatcher runs multiple times on entering Return Key in EditText
我有一个带 TextWatcher 的 EditText。
场景一:
EditText 包含“abcd”
如果我按 return 键或输入换行符
1) 在字符之前,TextWatcher
触发 3 次。
2) 在字符之间,TextWatcher
触发 4 次。
3) 在字符的末尾,TextWatcher
触发 1 次。
场景二:
EditText 包含“1234”
如果我按 return 键或输入换行符
1) 在字符之前,TextWatcher
触发 1 次。
2) 在字符之间,TextWatcher
触发 1 次。
3) 在字符的末尾,TextWatcher
触发 1 次。
这是一个错误吗?
或者有什么不明白的吗?
我希望文本观察器在所有场景中只触发一次。
任何帮助将不胜感激。
这是因为数字被计为单个值,即数字 1 或 12 "twelve" 而不是 1,2。相反,当您输入单词 "Strings" 时,它们会被分成字符,并且整个字符串中字符的总数将返回到 textWatcher 重载方法的计数参数中。
例如,如果您输入 123,它将被解释为单个值 123。因此计数返回为 1。当您输入 hello 时,它被分成单独的字符,即 'h'、'e'、'l'、'l'、'o'算作总共 5 个字符。因此返回的总计数为 5。
希望这个解释对您有所帮助。
我找到了解决方案,但可能无法满足所有需求。
之前,当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
也 多次触发 但是 if 条件中的代码只执行一次 我在问题中提到的场景。
我有一个带 TextWatcher 的 EditText。
场景一:
EditText 包含“abcd”
如果我按 return 键或输入换行符
1) 在字符之前,TextWatcher
触发 3 次。
2) 在字符之间,TextWatcher
触发 4 次。
3) 在字符的末尾,TextWatcher
触发 1 次。
场景二:
EditText 包含“1234”
如果我按 return 键或输入换行符
1) 在字符之前,TextWatcher
触发 1 次。
2) 在字符之间,TextWatcher
触发 1 次。
3) 在字符的末尾,TextWatcher
触发 1 次。
这是一个错误吗?
或者有什么不明白的吗?
我希望文本观察器在所有场景中只触发一次。
任何帮助将不胜感激。
这是因为数字被计为单个值,即数字 1 或 12 "twelve" 而不是 1,2。相反,当您输入单词 "Strings" 时,它们会被分成字符,并且整个字符串中字符的总数将返回到 textWatcher 重载方法的计数参数中。
例如,如果您输入 123,它将被解释为单个值 123。因此计数返回为 1。当您输入 hello 时,它被分成单独的字符,即 'h'、'e'、'l'、'l'、'o'算作总共 5 个字符。因此返回的总计数为 5。
希望这个解释对您有所帮助。
我找到了解决方案,但可能无法满足所有需求。
之前,当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
也 多次触发 但是 if 条件中的代码只执行一次 我在问题中提到的场景。