onTextChanged(CharSequence s, int start, int before, int count) 被多次调用
onTextChanged(CharSequence s, int start, int before, int count) is called multiple times
我正在 EditText 上实现 addTextChangedListener。
tagNameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
last_text_edit = System.currentTimeMillis();
searchStringFilter = s.toString();
h.removeCallbacks(input_finish_checker);
already_queried = false;
h.postDelayed(input_finish_checker, idleTime);
// getFilter().filter(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
问题是每当 EditText 中的文本发生变化时,它都会被多次调用。但我只想在文本更改后调用 OnTextChanged() 一次。有什么办法可以做到这一点?感谢您的帮助:)
每次文本更改时都会调用此方法,这意味着 EACH 次将新字母添加到 EditText。
这是设计使然。
您可以使用 View.OnFocusChangeListener 仅在用户将焦点从 EditText 移开时通知您。 (当 hasFocus
布尔值现在为 false
时,您必须进行过滤才能获得 'moving away from' edittext 视图。
这将允许您在每个 "Edit Session".
中只被调用 'once'
将您的代码移至 afterTextChanged
方法
@Override
public void afterTextChanged(Editable s) {
last_text_edit = System.currentTimeMillis();
searchStringFilter = tagNameEditText.getText().toString();
h.removeCallbacks(input_finish_checker);
already_queried = false;
h.postDelayed(input_finish_checker, idleTime);
}
onTextChanged :这意味着当你开始打字时,就像你想写 "sports" 然后这将调用每个字符,就像它会在你按 "s" 然后再按 "p" 然后 "o" 等等...
afterTextChanged : 这会在你停止输入时调用,它会在你完成 "sport".
后调用
我也遇到过类似的问题。我所做的是,我把时间说成 1 秒或 2 秒。因此,每当用户输入这么多 time/pause 时,我都会调用过滤器。
参考-
根据您对第一个答案的评论,search
应该有一个单独的按钮;如果您不想过滤子字符串...
我建议您应该对大小为 >n
的字符串调用过滤.. 比如
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
.
.
if size of s is > n:
cancel prev filtering
do fresh filtering on s
}
或;您可以在延迟 1 或 2 秒后对 afterTextChanged
进行过滤。您可以使用 Timer
和 TimerTask
..
我正在 EditText 上实现 addTextChangedListener。
tagNameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
last_text_edit = System.currentTimeMillis();
searchStringFilter = s.toString();
h.removeCallbacks(input_finish_checker);
already_queried = false;
h.postDelayed(input_finish_checker, idleTime);
// getFilter().filter(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
问题是每当 EditText 中的文本发生变化时,它都会被多次调用。但我只想在文本更改后调用 OnTextChanged() 一次。有什么办法可以做到这一点?感谢您的帮助:)
每次文本更改时都会调用此方法,这意味着 EACH 次将新字母添加到 EditText。
这是设计使然。
您可以使用 View.OnFocusChangeListener 仅在用户将焦点从 EditText 移开时通知您。 (当 hasFocus
布尔值现在为 false
时,您必须进行过滤才能获得 'moving away from' edittext 视图。
这将允许您在每个 "Edit Session".
中只被调用 'once'将您的代码移至 afterTextChanged
方法
@Override
public void afterTextChanged(Editable s) {
last_text_edit = System.currentTimeMillis();
searchStringFilter = tagNameEditText.getText().toString();
h.removeCallbacks(input_finish_checker);
already_queried = false;
h.postDelayed(input_finish_checker, idleTime);
}
onTextChanged :这意味着当你开始打字时,就像你想写 "sports" 然后这将调用每个字符,就像它会在你按 "s" 然后再按 "p" 然后 "o" 等等...
afterTextChanged : 这会在你停止输入时调用,它会在你完成 "sport".
后调用我也遇到过类似的问题。我所做的是,我把时间说成 1 秒或 2 秒。因此,每当用户输入这么多 time/pause 时,我都会调用过滤器。
参考-
根据您对第一个答案的评论,search
应该有一个单独的按钮;如果您不想过滤子字符串...
我建议您应该对大小为 >n
的字符串调用过滤.. 比如
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
.
.
if size of s is > n:
cancel prev filtering
do fresh filtering on s
}
或;您可以在延迟 1 或 2 秒后对 afterTextChanged
进行过滤。您可以使用 Timer
和 TimerTask
..