簡體   English   中英

Android:強制onKeyListener等待

[英]Android: force onKeyListener to wait

我目前有一些與用戶在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因為它之前抱怨我需要使用它)。 有什么建議么?

創建一個計時器。 當計時器觸發時,執行您的操作。 如果在定時器到期之前收到另一個按鍵,請取消定時器並重置。 就像是,

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);
}    

如果從timer任務的run()方法內部修改視圖樹,則必須強制它在UI線程上發生。 你可以這樣做,

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

您可以實現TimerTask以便稍后調用my_function。

http://developer.android.com/reference/java/util/TimerTask.html

我會首先嘗試忽略密鑰,發送一個包含所有密鑰數據的延遲消息(處理程序和co),並在收到消息后稍后傳遞該密鑰消息。

但是,我認為你需要setOnKeyListener的其他入口點,可能是onKeyEvent或dispatchKeyEvent

只是一個想法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM