Работа с быстрым нажатием на кнопки - PullRequest
10 голосов
/ 22 мая 2010

У меня есть кнопка с OnClickListener. Для наглядности рассмотрим кнопку, которая отображает модальное диалоговое окно:

public class SomeActivity ... {

  protected void onCreate(Bundle state) {
    super.onCreate(state);

    findViewById(R.id.ok_button).setOnClickListener(
      new View.OnClickListener() {
        public void onClick(View v) {
          // This should block input
          new AlertDialog.Builder(SomeActivity.this)
            .setCancelable(true)
            .show();
      }
    });
}

При обычном использовании появляется диалоговое окно с предупреждением и блокирует дальнейший ввод. Пользователи должны закрыть диалоговое окно, прежде чем они смогут снова нажать кнопку.

Но иногда OnClickListener кнопки вызывается дважды, прежде чем появится диалоговое окно. Вы можете легко скопировать это, быстро нажав на кнопку. Обычно мне приходится пробовать несколько раз, прежде чем это произойдет, но рано или поздно я вызову несколько вызовов onClick (...) перед вводом диалоговых блоков.

Я вижу такое поведение в Android 2.1 на телефоне Motorola Droid. Мы получили 4 отчета о сбоях на Маркете, указывающих, что это иногда случается с людьми.

В зависимости от того, что делают наши OnClickListeners, это вызывает разного рода хаос. Как мы можем гарантировать, что блокирующие диалоги фактически блокируют ввод после первого нажатия?

Ответы [ 2 ]

17 голосов
/ 24 мая 2010

Romain Guy подтвердил, что это действительно ошибка в Android: «Это происходит только в том случае, если пользователю удастся нажать кнопку дважды в течение

Мы будем использовать шаблон «стеклянная панель» для обхода ошибки в старых ОС. То есть мы закроем экран невидимым видом. После первого события щелчка мы сделаем вид «видимым», чтобы он перехватывал последующие события касания.

Недостаточно предотвратить дальнейшие события только одной кнопкой. Вам нужно заблокировать все последующие события для всего действия, пока диалог не будет закрыт, действие не возобновится и т. Д., После чего вы снова делаете стеклянную панель «невидимой».

Если это не сработает, мы просто должны с этим смириться и лучше переносить неожиданные дополнительные события.

9 голосов
/ 22 мая 2010

Спасибо за попытку, mdma, но это проблема платформы, а не проблема с нашим кодом. Что еще хуже, это, очевидно, не проблема, которую можно обойти в пользовательском коде (для этого требуются подробности из драйвера сенсорного экрана, которые не передаются). Кроме того, ваш пример кода не делает то, что вы думаете, что он делает. show () не показывает диалог сразу. Он добавляет сообщение в конец очереди событий, которое в конечном итоге показывает диалог. В очереди уже может быть больше событий касания, ожидающих выполнения после возврата onClick ().

Я не уверен, почему люди голосуют за этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...