2012-03-25 79 views
0

我目前有一些操作与用户在AutocompleteTextView中输入内容的时间有关。但是,如果用户停止输入,我只想要注册该操作。从本质上讲,我不希望在用户进行垃圾邮件输入时发生操作。下面的代码可能会更好地解释它。Android:强制onKeyListener等待

AutocompleteTextView search = ...; 
search.setOnKeyListener(new onKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (event.getAction() == KeyEvent.ACTION_UP) { 
      if (mTimer != null) 
       mTimer.cancel(); 
      mTimer = new Timer(); 
      mTimer.schedule(new TimerTask() { 
       public void run() { 
        my_func(); 
       } 
      }, 1000); 
      return true; 
     } 
     return false; 
    } 
} 

public void my_func() { 
    Looper.prepare(); 

    // Do some function that changes the View 

    Looper.loop(); 
} 

任何想法如何强制keyListener等待几秒钟?

编辑:

我现在使用计时器来安排函数。参考上面编辑的代码。

FIRST定时器的工作原理。但是,当我尝试重新调用第二个计时器的函数时,我得到一个异常,表示只有初始化View的主线程才能修改View。我不确定Looper是如何工作的(我只是添加了Looper,因为它在我需要使用之前就抱怨过了)。有什么建议么?

回答

1

创建一个定时器。当计时器触发时,请执行您的操作。如果您在定时器到期前收到另一次按键,请取消定时器并重置。喜欢的东西,

public boolean onKey(View v, int keyCode, KeyEvent event) { 
    if (mTimer != null) { 
    mTimer.cancel(); 
    } 
    mTimer = new Timer(); 
    mTimer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     // do what you need to do after the one second here 
     mTimer = null; 
    } 
    }, 1000); 
}  

如果修改从定时任务的run()方法中的视图树,你必须强迫它在UI线程上发生。你可以这样做,

YouActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
    // modify your UI components here 
    } 
}); 
+0

谢谢!我得到它与TimerTask的工作。 – Jin 2012-03-25 19:01:17

+0

我遇到了有关线程的新问题,您是否知道我如何获得计划的计时器任务以使用同时修改视图的函数? – Jin 2012-03-25 19:17:35

+0

见编辑答案。 – 2012-03-25 19:25:12

0

我会尽量忽略密钥, 发送一个延迟的消息(处理程序和co),它保存所有密钥数据,并在稍后收到消息时发送该密钥消息。

不过,我认为你需要其他的切入点setOnKeyListener,可onKeyEvent或dispatchKeyEvent

只是一个想法