onTextChanged(CharSequence s,int start,int before,int count)被多次调用

时间:2015-12-24 05:42:18

标签: android android-edittext android-textwatcher

我正在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()。有没有办法实现这个目标?任何帮助表示赞赏:)

4 个答案:

答案 0 :(得分:1)

即使我遇到了类似的问题。我做的是,我把时间说1秒或2秒。所以每当用户在打字时花费这么多时间/停顿时,我都会调用过滤器。

参考 -

https://stackoverflow.com/a/12143050/1320616

答案 1 :(得分:0)

每次文本更改时都会调用此方法,这意味着将每次时间添加到EditText中。

它是按设计工作的。

您可以使用View.OnFocusChangeListener仅在用户将焦点从EditText更改时通知您。 (当false布尔值现在为{{1}}时,您必须进行过滤,以便“远离”编辑文本视图。

这将允许您只为每个“编辑会话”调用“一次”。

答案 2 :(得分:0)

将代码移至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"之后调用。

答案 3 :(得分:0)

根据您对第一个答案的评论,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进行过滤..您可以使用TimerTimerTask ..