Android: заставить onKeyListener ждать - PullRequest
0 голосов
/ 25 марта 2012

В настоящее время у меня есть какое-то действие, связанное с тем, когда пользователь вводит что-то в 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 ждать определенное количество секунд?

РЕДАКТИРОВАТЬ:

IСейчас я использую таймер для планирования функции.См. Отредактированный выше код.

ПЕРВЫЙ таймер работает.Однако, когда я пытаюсь повторно вызвать функцию во втором таймере, я получаю исключение, которое говорит, что только основной поток, который инициализировал представление, может изменить представление.Я не уверен, как работает Looper (я только что добавил Looper, потому что раньше жаловался, что мне нужно его использовать).Есть предложения?

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Создать таймер. Когда Таймер срабатывает, делайте свои действия. Если вы получили другое нажатие до истечения времени таймера, отмените таймер и сбросьте его. Что-то вроде

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() задачи таймера, вы должны принудительно вызвать его в потоке пользовательского интерфейса. Вы можете сделать это, как,

YouActivity.this.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    // modify your UI components here
  }
});
1 голос
/ 25 марта 2012

Вы можете реализовать TimerTask для вызова my_function позже.

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

0 голосов
/ 25 марта 2012

Сначала я попытался бы проигнорировать ключ, отправить задержанное сообщение (handler и co), содержащее все данные ключа, и доставить это сообщение ключа позже, когда сообщение было получено.

Однако я думаю,вам нужны другие точки входа setOnKeyListener, может быть onKeyEvent или dispatchKeyEvent

Просто идея

...