我目前有一些与用户在AutocompleteTextView中输入内容相关联的操作。但是,我只想在用户停止输入时注册操作。从本质上讲,我不希望在用户进行垃圾邮件打字时发生操作。以下代码可能会更好地解释它。
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等待一定的秒数?
编辑:
我现在使用Timer来安排该功能。请参阅以上编辑的代码。
FIRST计时器有效。但是,当我尝试重新唤起第二个计时器的函数时,我得到一个异常,说明只有初始化View的主线程才能修改View。我不确定Looper是如何工作的(我刚刚添加了Looper因为它之前抱怨我需要使用它)。有什么建议吗?
答案 0 :(得分: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
}
});
答案 1 :(得分:1)
您可以实现TimerTask以便稍后调用my_function。
http://developer.android.com/reference/java/util/TimerTask.html
答案 2 :(得分:0)
我会先尝试忽略这个键, 发送包含所有关键数据的延迟消息(处理程序和co), 并在收到邮件后再发送该密钥消息。
但是,我认为你需要setOnKeyListener的其他入口点,可能是onKeyEvent或dispatchKeyEvent
只是一个想法