Qual é a melhor maneira de evitar cliques duplos em um botão no Android?
android
android-button
double-click
Androider
fonte
fonte
Respostas:
Desative o botão com
setEnabled(false)
até que seja seguro para o usuário clicar nele novamente.fonte
salvar a última vez em que clicar ao evitar esse problema.
ie
fonte
Minha solução é
O uso é semelhante ao OnClickListener, mas substitui onSingleClick ():
fonte
Desabilitar o botão ou definir não clicável não é suficiente se você estiver fazendo um trabalho intensivo computacional em onClick (), pois os eventos de clique podem ficar na fila antes que o botão possa ser desabilitado. Eu escrevi uma classe base abstrata que implementa o OnClickListener que você pode substituir, que corrige esse problema ignorando todos os cliques na fila:
O uso é o mesmo que OnClickListener, mas substitui OnOneClick ():
fonte
Você pode fazer isso de maneira muito sofisticada com as Funções de extensão Kotlin e RxBinding
ou
e então apenas:
fonte
Eu também corro em um problema semelhante, eu estava exibindo alguns marcadores de data e hora em que às vezes recebia 2 vezes. Eu resolvi isso com isso
Você pode alterar o tempo, dependendo da sua exigência. Este método funciona para mim.
fonte
setEnabled(false)
funciona perfeitamente para mim.A ideia é que eu escreva
{ setEnabled(true); }
no começo e apenas faça issofalse
no primeiro clique do botão.fonte
Sei que é uma pergunta antiga, mas compartilho a melhor solução que encontrei para resolver esse problema comum
E em outro arquivo, como Utils.java
fonte
A solução real para esse problema é usar setEnabled (false), que pressiona o botão, e setClickable (false), que faz com que o segundo clique não possa ser recebido. Eu testei isso e parece ser muito eficaz.
fonte
Se alguém ainda estiver procurando uma resposta curta, use o código abaixo
Este código entrará
if statement
sempre que o usuário clicar noView within 1 second
e, em seguidareturn;
, será iniciado e o código adicional não será iniciado.fonte
A maneira idiomática do K LEANEST Kotlin :
Uso:
fonte
Minha solução é tentar usar uma
boolean
variável:E usando como abaixo:
ATUALIZAÇÃO : solução Kotlin, usando a extensão de exibição
fonte
Click Guard funciona bem com a faca de manteiga
fonte
na minha situação, eu estava usando a exibição de botão e os cliques eram rápidos demais. basta desativar o clicável e ativá-lo novamente depois de alguns segundos ...
Basicamente, eu criei uma classe de wrapper que envolve seus Views onClickListener. você também pode definir um atraso personalizado, se desejar.
e para chamá-lo simplesmente faça o seguinte:
ou forneça seu próprio atraso:
ATUALIZAÇÃO: Acima das maneiras um pouco antiquadas, agora que o RxJava é tão prevalente. Como outros já mencionaram, no Android, podemos usar um acelerador para diminuir a velocidade dos cliques. aqui está um exemplo:
você pode usar esta biblioteca para isso:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
fonte
fonte
Você pode usar esse método Ao usar o atraso de postagem, você pode cuidar de eventos de clique duplo.
void debounceEffectForClick (exibição de exibição) {
fonte
Extensão Kotlin que permite código embutido conciso e tempos de espera variáveis com clique duplo
Uso:
Ou
fonte
O código abaixo evitará que o usuário clique várias vezes em frações de segundos e permita apenas após 3 segundos.
fonte
Parece que definir os ouvintes de clique em onResume e anulá-los em onPause também funciona.
fonte
Para mim, apenas lembrar o carimbo de data e hora e checá-lo (que mais de 1 segundo se passou desde o clique anterior) ajudaram.
fonte
Espero que isso possa ajudá-lo, coloque o código no seu manipulador de eventos.
// ------------------------------------------------ --------------------------------
fonte
Descobri que nenhuma dessas sugestões funciona se o método onClick não retornar imediatamente. O evento de toque é enfileirado pelo Android e o próximo onClick é chamado somente após a conclusão do primeiro. (Como isso é feito em um thread da interface do usuário, isso é realmente normal.) Eu precisava usar o horário em que a função onClick foi concluída + uma variável booleana para marcar se o onClick fornecido está em execução. Ambos os atributos do marcador são estáticos para evitar que onClickListener seja executado ao mesmo tempo. (Se o usuário clicar em outro botão) Você pode substituir seu OnClickListener por essa classe e, em vez de implementar o método onClick, é necessário implementar o método abstract oneClick ().
fonte
você também pode usar ligações rx por jake wharton para fazer isso. Aqui está um exemplo que preenche 2 segundos entre cliques sucessivos:
// note: ignore o objeto v nesse caso e acho que sempre.
fonte
fonte
Adicionando à resposta de Jim, o código pode ser mais conciso:
Uso:
fonte
No kotlin
fonte
Definir Clicável como falso não funciona no primeiro clique duplo, mas os cliques duplos subsequentes são bloqueados. É como se o clique de carregamento delegado fosse mais lento na primeira vez e o segundo clique fosse capturado antes da conclusão do primeiro.
fonte
Corrijo esse problema usando dois clases, um semelhante ao da resposta @ jinshiyi11 e o anoter é baseado em cliques explícitos; neste, você pode clicar em um botão apenas uma vez, se desejar outro clique, deve indicar explicitamente .
Exemplo de uso:
fonte
fonte
AtomicBoolean
não pode ajudar.Tente isso, está funcionando:
fonte