2012-03-25 59 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

只是一個想法

相關問題