Eu tenho um diálogo com EditText
para entrada. Quando clico no botão "yes" na caixa de diálogo, ele validará a entrada e fechará a caixa de diálogo. No entanto, se a entrada estiver errada, desejo permanecer na mesma caixa de diálogo. Sempre que qualquer que seja a entrada, a caixa de diálogo deve ser fechada automaticamente quando eu clicar no botão "não". Como posso desativar isso? A propósito, eu usei o PositiveButton e o NegativeButton para o botão na caixa de diálogo.
732
Aqui estão algumas soluções para todos os tipos de caixas de diálogo, incluindo uma solução para AlertDialog.Builder que funcionará em todos os níveis da API (funciona abaixo da API 8, que a outra resposta aqui não). Existem soluções para AlertDialogs usando AlertDialog.Builder, DialogFragment e DialogPreference.
Abaixo estão os exemplos de código que mostram como substituir o manipulador de botão comum padrão e impedir que o diálogo seja fechado para essas diferentes formas de diálogo. Todos os exemplos mostram como impedir que o botão positivo feche a caixa de diálogo.
Nota: Uma descrição de como o fechamento da caixa de diálogo funciona sob o capô para as classes android básicas e por que as seguintes abordagens são escolhidas a seguir após os exemplos, para quem deseja obter mais detalhes
AlertDialog.Builder - Alterar manipulador de botão padrão imediatamente após show ()
DialogFragment - substituir onResume ()
DialogPreference - substitui showDialog ()
Explicação das abordagens:
fonte
ProgressDialog
quando um botão é clicado nele?Uma solução alternativa
Gostaria de apresentar uma resposta alternativa de uma perspectiva de UX.
Por que você deseja impedir que uma caixa de diálogo seja fechada quando um botão é clicado? Presumivelmente, é porque você tem uma caixa de diálogo personalizada na qual o usuário não fez uma escolha ou ainda não preencheu tudo completamente. E se eles não tiverem terminado, não permita que eles cliquem no botão positivo. Apenas desative-o até que tudo esteja pronto.
As outras respostas aqui oferecem muitos truques para substituir o clique do botão positivo. Se isso fosse importante, o Android não teria feito um método conveniente? Eles não fizeram.
Em vez disso, o guia de design de Diálogos mostra um exemplo dessa situação. O botão OK é desativado até que o usuário faça uma escolha. Não são necessários truques de substituição. É óbvio para o usuário que algo ainda precisa ser feito antes de prosseguir.
Como desativar o botão positivo
Veja o documentação Android para criar um layout de caixa de diálogo personalizado . Recomenda que você coloque o seu
AlertDialog
interior aDialogFragment
. Depois, basta definir os ouvintes nos elementos de layout para saber quando ativar ou desativar o botão positivo.EditText
, use o TextWatcher .O botão positivo pode ser desativado assim:
Aqui está um trabalho inteiro
DialogFragment
com um botão positivo desativado, como pode ser usado na imagem acima.O diálogo personalizado pode ser executado a partir de uma atividade como esta:
Notas
O botão ainda está
null
dentro,onCreateDialog
então eu o desativeionResume
. Isso tem o efeito indesejável de desativá-lo novamente se o usuário alternar para outro aplicativo e depois voltar sem descartar a caixa de diálogo. Isso pode ser resolvido desmarcando também qualquer opção do usuário ou chamandoRunnable
deonCreateDialog
para desativar o botão no próximo ciclo de execução.Relacionado
fonte
Eu escrevi uma classe simples (um AlertDialogBuilder) que você pode usar para desativar o recurso de dispensa automática ao pressionar os botões da caixa de diálogo.
Também é compatível com o Android 1.6, portanto, não utiliza o OnShowListener (que está disponível apenas API> = 8).
Portanto, em vez de usar o AlertDialog.Builder, você pode usar este CustomAlertDialogBuilder. A parte mais importante é que você não deve chamar create () , mas apenas o método show () . Adicionei métodos como setCanceledOnTouchOutside () e setOnDismissListener para que você ainda possa configurá-los diretamente no construtor.
Eu testei no Android 1.6, 2.x, 3.xe 4.x, por isso deve funcionar muito bem. Se você encontrar alguns problemas, comente aqui.
EDIT Aqui está um pequeno exemplo de como usar o CustomAlertDialogBuilder:
Felicidades,
Yuvi
fonte
Context mContext
e defina-o no construtor.Aqui está algo se você estiver usando
DialogFragment
- que é a maneira recomendada de lidar com as caixas de diálogo de qualquer maneira.O que acontece com o AlertDialog
setButton()
método (e imagino o mesmo comAlertDialogBuilder
'ssetPositiveButton()
esetNegativeButton()
) é que o botão definido (por exemploAlertDialog.BUTTON_POSITIVE
) com ele vai realmente provocar dois diferentesOnClickListener
objetos quando pressionado.O primeiro ser DialogInterface.OnClickListener , que é um parâmetro para
setButton()
,setPositiveButton()
, esetNegativeButton()
.O outro é o View.OnClickListener , que será configurado para dispensar automaticamente o seu
AlertDialog
quando qualquer botão for pressionado - e é definido porAlertDialog
si só.O que você pode fazer é usar
setButton()
comnull
comoDialogInterface.OnClickListener
, para criar o botão e, em seguida, chamar o seu costume método de ação dentroView.OnClickListener
. Por exemplo,Então, você pode substituir o padrão
AlertDialog
's botões'View.OnClickListener
(que de outra forma descartar o diálogo) noDialogFragment
'sonResume()
método:Você precisará definir isso no
onResume()
método, poisgetButton()
retornaránull
até depois que a caixa de diálogo for exibida!Isso deve fazer com que seu método de ação personalizado seja chamado apenas uma vez e a caixa de diálogo não será descartada por padrão.
fonte
Inspirado na resposta de Tom, acredito que a idéia aqui é:
onClickListener
durante a criação da caixa de diálogo paranull
onClickListener
após o diálogo ser mostrado.Você pode substituir o
onShowListener
Tom semelhante. Como alternativa, você podeshow()
onClickListener
como a seguir (acho que um pouco mais legível).Código:
fonte
Para a pré API 8, resolvi o problema usando um sinalizador booleano, um ouvinte de dispensa e um diálogo de chamada. Mostre novamente se o conteúdo do editText não estava correto. Como isso:
fonte
A resposta neste link é uma solução simples e compatível com a API 3. É muito semelhante à solução de Tom Bollwitt, mas sem usar o OnShowListener menos compatível.
Fiz pequenas adaptações no código de Kamen desde que eu estava estendendo uma EditTextPreference.
Que divertido!
fonte
Este código funcionará para você, porque eu tive um problema semelhante e isso funcionou para mim. :)
1- Substitua o método Onstart () na sua classe de diálogo de fragmento.
fonte
For ProgressDialogs
Para impedir que a caixa de diálogo seja descartada automaticamente, você deve definir o
OnClickListener
seguinte após aProgressDialog
exibição, da seguinte maneira:fonte
fonte
você pode adicionar builder.show (); após a mensagem de validação antes do retorno;
como isso
fonte
Para impedir que a caixa de diálogo seja fechada quando clicada, ela deve ser fechada apenas quando a Internet estiver disponível
Estou tentando fazer a mesma coisa, pois não quero que a caixa de diálogo seja fechada até e a menos que a Internet esteja conectada.
Aqui está o meu código:
E aqui está o meu código do gerenciador de conectividade:
fonte
The specified child already has a parent. You must call removeView() on the child's parent first
Se você estiver usando
material design
, sugiro verificar as caixas de diálogo de materiais . Ele corrigiu vários problemas para mim relacionados aos bugs do Android atualmente abertos (consulte 78088 ), mas o mais importante para esse ticket é que ele possui umautoDismiss
sinalizador que pode ser definido ao usar oBuilder
.fonte
Use um layout personalizado para você
DialogFragment
e adicione umLinearLayout
sob seu conteúdo, que pode ser estilizado como sem bordas para corresponder ao Design de materiais do Google. Em seguida, encontre os botões recém-criados e substitua os delesOnClickListener
.Exemplo:
dialog_add_topic.xml :
Esse é o resultado final.
fonte
Pode ser construído da maneira mais fácil:
Caixa de diálogo de alerta com exibição personalizada e com dois botões (positivo e negativo).
CustomClickLister do botão positivo do alerta Dailog :
Feito
fonte
Provavelmente, essa é uma resposta muito tardia, mas o uso de setCancelable fará o truque.
fonte