应在之后检测文本更改

时间:2013-02-25 12:27:29

标签: android android-edittext autocompletetextview

在AutoCompleteTextView中,我想在用户输入暂停1秒后显示自动完成列表。 我尝试使用处理程序

handler.postDelayed( new Runnable() {

            @Override
            public void run() {

                // TODO Auto-generated method stub
                if ( text.length() >= 3 ) {
                    // do something                     

                } else if ( text.length() == 0 ) {
                    // do something

                }
            }

        }, 1000 );

此代码是onTextChanged的一部分。所以它发生的事情就是当postDelayed被调用并且内部代码将在一秒钟之后调用时,每当有文本更改时。那么我该怎样才能防止这种情况发生,因此只有当用户在打字时出现1秒钟的情况时才会调用内部代码。

e.g: 如果我输入Ind(暂停1秒),则应执行内部代码执行。 但是我键入印度然后内部代码不应该执行Ind,Indi,India。 需要你的建议。

4 个答案:

答案 0 :(得分:2)

创建两个保存时间戳的静态变量 lastTimeStampcurrentTimeStamp,然后您可以执行以下操作:

        @Override
        public void run() {
            if (currentTimeStamp - lastTimeStamp > 1000) {
               // TODO Auto-generated method stub
               if ( text.length() >= 3 ) {
                  // do something                     

               } else if ( text.length() == 0 ) {
                     // do something

               }
            }
        }

新方法:

在onTextChanged方法的开头,将当前的TimeStamp放在一个类变量中。
然后在onTextChanged中创建一个AsyncTask,它正在做一个 doInBackground方法中的Thread.sleep(1000) 然后在postExcute方法中创建一个if语句,检查类变量中TimeStamp与当前TimeStamp之间的差异,如果这大于1000,则发布处理程序。

答案 1 :(得分:1)

我只是站在同一个问题上 我在调用Googles Geocode建议API onTextChanged(),这引起了很多问题。 用户键入会导致大量API请求,其中大部分都不是必需的,并且会耗尽API(花钱)并减少用户从应用程序收到的体验。

我在这里考虑过这些解决方案,但我最终不喜欢它们中的任何一种,它们看起来不干净或者像黑客一样。
我不想进一步调用UI以获取View的当前值(再次)或检查系统时间。

原始问题实际上已经解决了问题,它只会导致多个runnables在用户输入时处于活动状态。
所以问题应该是:“如何在它导致麻烦之前删除我的匿名runnable?”

所有你需要做的就是使用原始方法(使用匿名runnable延迟调用),每当调用onTextChanged函数时,你删除任何以前的runnables。
您还可以扩展代码并检查值是否真的发生了变化(例如使用全局先前值String),这样如果用户输入了char并再次删除它,则不会终止runnable。

所以你需要做的就是: 1.使Handler成为类的变量,而不是在onTextChanged中创建它 2.在onTextChanged的开头,从处理程序中删除runnables

这是一个功能齐全的例子:

    Handler onchangeHandler =  new Handler();
    String last_onTextChanged=""; // may speed up some cases of user input, can be removed
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
    {
        final String value = charSequence.toString();
        if (value.length() < 3) {autoCompleteAdapter.clear();return;} // threshold of 3 chars

        if (!last_onTextChanged.equals(value))
            onchangeHandler.removeCallbacksAndMessages(null);
        else
            return;
    last_onTextChanged=value;
    onchangeHandler.postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            // RUN CODE HERE, fill your autoCompleteAdapter etc.
        }
    },800);

}

答案 2 :(得分:0)

有两个选项:

  1. 当你打算运行下一个任务时,使用Timer并对之前的任务调用cancel()。

  2. 扩展Runnable并传入一个字符串以进行此自动完成。如果此字符串不等于视图中的当前字符串(这意味着用户更改了字符串),则不应显示自动完成。

  3. 代码示例:

    abstract class MyRunnable {
        private String str;
    
        public MyRunnable(String str) {
            this.str = str;
        }
    }
    
    
    ...
    
    handler.postDelayed(new MyRunnable(currentViewStr) {
    
        @Override
        public void run() {
            if (currentViewStr.equals(str)) {
                // show autocompletion
            }
        }
    }, 1000);
    

答案 3 :(得分:0)

您还可以先在Runnable

中取消消息队列中的上一个onTextChanged()消息