Каков наилучший способ предотвратить двойное нажатие на кнопку в Android?
android
android-button
double-click
Androider
источник
источник
Ответы:
Отключите кнопку,
setEnabled(false)
пока пользователь не сможет снова нажать ее.источник
сохранение последнего щелчка при нажатии предотвратит эту проблему.
т.е.
источник
Мое решение
Использование аналогично OnClickListener, но вместо этого переопределяет onSingleClick ():
источник
Отключение кнопки или настройка unclickable не достаточно, если вы выполняете интенсивную вычислительную работу в onClick (), поскольку события щелчка могут быть поставлены в очередь, прежде чем кнопка может быть отключена. Я написал абстрактный базовый класс, который реализует OnClickListener, который вы можете вместо этого переопределить, чтобы решить эту проблему, игнорируя любые щелчки в очереди:
Использование такое же, как OnClickListener, но вместо этого переопределяет OnOneClick ():
источник
Вы можете сделать это очень причудливым способом с помощью функций расширения Kotlin и RxBinding
или
а потом просто:
источник
Я также столкнулся с подобной проблемой, я отображал некоторые средства выбора даты и времени, где иногда он получал клик 2 раза. Я решил это этим
Вы можете изменить время в зависимости от ваших требований. Этот метод работает для меня.
источник
setEnabled(false)
отлично работает для меняИдея в том, что я пишу
{ setEnabled(true); }
в начале и просто делаю этоfalse
по первому нажатию кнопки.источник
Я знаю, что это старый вопрос, но я разделяю лучшее решение, которое я нашел, чтобы решить эту общую проблему
И в другом файле, как Utils.java
источник
Фактическое решение этой проблемы состоит в том, чтобы использовать setEnabled (false), который скрывает кнопку, и setClickable (false), который делает его таким, что второй щелчок не может быть получен. Я проверил это, и это кажется очень эффективным.
источник
Если кто-то все еще ищет короткий ответ, вы можете использовать следующий код
Этот код будет входить в
if statement
каждый раз, когда пользователь нажимает на,View within 1 second
а затемreturn;
будет инициирован, и дальнейший код не будет инициирован.источник
K скудного Котлин идиоматический способ:
Использование:
источник
Мое решение - попытаться использовать
boolean
переменную:И используя как ниже:
ОБНОВЛЕНИЕ : решение Kotlin, используя расширение представления
источник
Click Guard хорошо работает с ножом для масла
источник
в моей ситуации я использовал вид кнопок, и он слишком быстро брал клики. просто отключите кликабельный и снова включите его через несколько секунд ...
По сути, я создал класс-обертку, который оборачивает ваши представления onClickListener. Вы также можете установить пользовательскую задержку, если хотите.
и чтобы вызвать это просто сделайте это:
или укажите собственную задержку:
ОБНОВЛЕНИЕ: Выше немного старомодно сейчас, когда RxJava настолько распространен. как уже упоминали другие, в Android мы могли бы использовать дроссель, чтобы замедлить щелчки. вот один пример:
Вы можете использовать эту библиотеку для этого:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
источник
источник
Вы можете использовать этот метод. Используя пост-задержку, вы можете позаботиться о событиях двойного щелчка.
void debounceEffectForClick (View view) {
источник
Расширение Kotlin, позволяющее получить краткий встроенный код и переменное время ожидания двойного щелчка
Использование:
Или
источник
Приведенный ниже код не позволит пользователю нажимать несколько раз в течение доли секунды и разрешать только через 3 секунды.
источник
Кажется, что установка прослушивателей щелчков в onResume и обнуление их в onPause тоже помогает.
источник
Для меня помогло только помнить временную метку и проверять ее (что прошло более 1 секунды с момента предыдущего клика).
источник
Я надеюсь, что это может помочь вам, поместите код в ваш обработчик событий.
// ------------------------------------------------ --------------------------------
источник
Я обнаружил, что ни одно из этих предложений не работает, если метод onClick не возвращается немедленно. Android-событие ставится в очередь, и следующий onClick вызывается только после завершения первого. (Так как это делается в одном потоке пользовательского интерфейса, это действительно нормально.) Мне нужно было использовать время завершения функции onClick + одну логическую переменную, чтобы указать, работает ли данный onClick. Оба эти атрибута маркера являются статическими, чтобы избежать одновременного запуска onClickListener. (Если пользователь нажимает на другую кнопку) Вы можете просто заменить свой OnClickListener на этот класс, и вместо реализации метода onClick вам нужно реализовать абстрактный метод oneClick ().
источник
Вы также можете использовать rx-привязки Джейка Уортона для достижения этой цели. Вот пример, который добавляет 2 секунды между последовательными щелчками:
// примечание: игнорировать Object v в этом случае, и я думаю, что всегда.
источник
источник
Добавив ответ Джима, код можно сделать более лаконичным:
Использование:
источник
В котлине
источник
Настройка Clickable на false не работает при первом двойном щелчке, но последующие двойные щелчки блокируются. Как будто делегат щелчка загрузки в первый раз медленнее, а второй щелчок захватывается до завершения первого.
источник
Я исправляю эту проблему, используя два предложения, одно из которых похоже на ответ @ jinshiyi11, а анотер основан на явном щелчке; при этом вы можете нажать кнопку только один раз, если вы хотите еще один щелчок, вы должны указать это явно .
Пример использования:
источник
источник
AtomicBoolean
не может помочь.Попробуйте это, это работает:
источник