J'ai une boîte de dialogue avec EditText
pour entrée. Lorsque je clique sur le bouton "oui" de la boîte de dialogue, cela validera l'entrée, puis fermera la boîte de dialogue. Cependant, si l'entrée est incorrecte, je veux rester dans la même boîte de dialogue. Chaque fois, quelle que soit l'entrée, la boîte de dialogue doit se fermer automatiquement lorsque je clique sur le bouton "non". Comment puis-je désactiver cela? Par ailleurs, j'ai utilisé PositiveButton et NegativeButton pour le bouton de dialogue.
732
Voici quelques solutions pour tous les types de boîtes de dialogue, y compris une solution pour AlertDialog.Builder qui fonctionnera à tous les niveaux d'API (fonctionne en dessous de l'API 8, ce que l'autre réponse ici ne fait pas). Il existe des solutions pour AlertDialogs utilisant AlertDialog.Builder, DialogFragment et DialogPreference.
Vous trouverez ci-dessous des exemples de code montrant comment remplacer le gestionnaire de boutons communs par défaut et empêcher la boîte de dialogue de se fermer pour ces différentes formes de boîtes de dialogue. Tous les exemples montrent comment empêcher le bouton positif de fermer la boîte de dialogue.
Remarque: Une description du fonctionnement de la fermeture de la boîte de dialogue sous le capot pour les classes Android de base et des raisons pour lesquelles les approches suivantes sont choisies suit les exemples, pour ceux qui souhaitent plus de détails.
AlertDialog.Builder - Modifier le gestionnaire de boutons par défaut immédiatement après show ()
DialogFragment - remplacer onResume ()
DialogPreference - remplacer showDialog ()
Explication des approches:
la source
ProgressDialog
lorsqu'un bouton est cliqué dessus?Une solution alternative
Je voudrais présenter une autre réponse du point de vue UX.
Pourquoi voudriez-vous empêcher une boîte de dialogue de se fermer lorsqu'un bouton est cliqué? Vraisemblablement, c'est parce que vous avez une boîte de dialogue personnalisée dans laquelle l'utilisateur n'a pas fait de choix ou n'a pas encore tout rempli. Et s'ils ne sont pas terminés, vous ne devez pas du tout leur permettre de cliquer sur le bouton positif. Désactivez-le jusqu'à ce que tout soit prêt.
Les autres réponses ici donnent de nombreuses astuces pour remplacer le clic positif du bouton. Si cela était important à faire, Android n'aurait-il pas fait une méthode pratique pour le faire? Ils ne l'ont pas fait.
Au lieu de cela, le guide de conception des boîtes de dialogue montre un exemple d'une telle situation. Le bouton OK est désactivé jusqu'à ce que l'utilisateur fasse un choix. Aucune astuce prioritaire n'est nécessaire du tout. Il est évident pour l'utilisateur que quelque chose doit encore être fait avant de continuer.
Comment désactiver le bouton positif
Consultez la documentation Android pour créer une disposition de boîte de dialogue personnalisée . Il vous recommande de placer votre
AlertDialog
intérieur aDialogFragment
. Ensuite, tout ce que vous devez faire est de définir des écouteurs sur les éléments de mise en page pour savoir quand activer ou désactiver le bouton positif.EditText
, utilisez TextWatcher .Le bouton positif peut être désactivé comme ceci:
Voici un travail complet
DialogFragment
avec un bouton positif désactivé tel que celui utilisé dans l'image ci-dessus.La boîte de dialogue personnalisée peut être exécutée à partir d'une activité comme celle-ci:
Remarques
Le bouton est toujours
null
en placeonCreateDialog
, je l'ai donc désactivéonResume
. Cela a pour effet indésirable de le désactiver à nouveau si l'utilisateur passe à une autre application, puis revient sans fermer la boîte de dialogue. Cela pourrait être résolu en décochant aussi des choix de l' utilisateur ou en appelant unRunnable
deonCreateDialog
pour désactiver le bouton de la boucle suivante de l' exécution.en relation
la source
J'ai écrit une classe simple (AlertDialogBuilder) que vous pouvez utiliser pour désactiver la fonction de suppression automatique lorsque vous appuyez sur les boutons de la boîte de dialogue.
Il est également compatible avec Android 1.6, il n'utilise donc pas OnShowListener (qui n'est disponible que pour l'API> = 8).
Ainsi, au lieu d'utiliser AlertDialog.Builder, vous pouvez utiliser ce CustomAlertDialogBuilder. La partie la plus importante est que vous ne devez pas appeler create () , mais uniquement la méthode show () . J'ai ajouté des méthodes comme setCanceledOnTouchOutside () et setOnDismissListener afin que vous puissiez toujours les définir directement sur le générateur.
Je l'ai testé sur Android 1.6, 2.x, 3.x et 4.x, cela devrait donc fonctionner assez bien. Si vous rencontrez des problèmes, veuillez commenter ici.
EDIT Voici un petit exemple sur la façon d'utiliser le CustomAlertDialogBuilder:
À votre santé,
Yuvi
la source
Context mContext
et définissez-le à la place dans le constructeur.Voici quelque chose si vous utilisez
DialogFragment
- qui est de toute façon la méthode recommandée pour gérer les dialogues.Qu'est - ce qui se passe avec de AlertDialog
setButton()
méthode (et je pense la même chose avecAlertDialogBuilder
l »setPositiveButton()
etsetNegativeButton()
) est que le bouton vous définissez (par exempleAlertDialog.BUTTON_POSITIVE
) avec elle déclenche réellement deux différentsOnClickListener
objets lorsqu'ils sont pressés.La première étant DialogInterface.OnClickListener , qui est un paramètre de
setButton()
,setPositiveButton()
, etsetNegativeButton()
.L'autre est View.OnClickListener , qui sera configuré pour fermer automatiquement votre
AlertDialog
lorsque l'un de ses boutons est enfoncé - et est défini parAlertDialog
lui-même.Ce que vous pouvez faire est d'utiliser
setButton()
avecnull
commeDialogInterface.OnClickListener
, de créer le bouton, puis d'appeler votre méthode d'action personnalisée à l'intérieurView.OnClickListener
. Par exemple,Ensuite, vous pouvez remplacer la valeur par défaut
AlertDialog
« boutons » sView.OnClickListener
(qui autrement rejeter la boîte de dialogue) dans leDialogFragment
deonResume()
méthode:Vous devrez le définir dans la
onResume()
méthode, cargetButton()
il reviendranull
jusqu'à ce que la boîte de dialogue soit affichée!Cela devrait entraîner que votre méthode d'action personnalisée ne soit appelée qu'une seule fois et la boîte de dialogue ne sera pas fermée par défaut.
la source
Inspiré par la réponse de Tom, je crois que l'idée ici est:
onClickListener
pendant la création de la boîte de dialogue surnull
onClickListener
fois que la boîte de dialogue est affichée.Vous pouvez remplacer le
onShowListener
Tom comme. Vous pouvez égalementshow()
onClickListener
comme suit (un peu plus lisible je pense).Code:
la source
Pour la pré API 8, j'ai résolu le problème en utilisant un drapeau booléen, un écouteur de rejet et en appelant dialog.show à nouveau si au cas où le contenu du editText n'était pas correct. Comme ça:
la source
La réponse à ce lien est une solution simple, et qui est compatible directement avec l'API 3. Elle est très similaire à la solution de Tom Bollwitt, mais sans utiliser le OnShowListener moins compatible.
J'ai apporté des adaptations mineures au code de Kamen depuis que j'étendais un EditTextPreference.
Si amusant!
la source
Ce code fonctionnera pour vous, car j'ai eu un problème similaire et cela a fonctionné pour moi. :)
1- Remplacez la méthode Onstart () dans votre classe de dialogue de fragments.
la source
Pour ProgressDialogs
Pour éviter que la boîte de dialogue ne soit automatiquement fermée, vous devez définir le
OnClickListener
après que leProgressDialog
s'affiche, comme ceci:la source
la source
vous pouvez ajouter builder.show (); après message de validation avant retour;
comme ça
la source
Pour empêcher la boîte de dialogue de se fermer lorsque vous cliquez dessus et elle ne doit se fermer que lorsque Internet est disponible
J'essaie de faire la même chose, car je ne veux pas que la boîte de dialogue soit fermée tant que Internet n'est pas connecté.
Voici mon code:
Et voici mon code de gestionnaire de connectivité:
la source
The specified child already has a parent. You must call removeView() on the child's parent first
Si vous utilisez,
material design
je vous suggère de vérifier les dialogues de matériaux . Il a corrigé plusieurs problèmes liés aux bogues Android actuellement ouverts (voir 78088 ), mais surtout pour ce ticket, il a unautoDismiss
indicateur qui peut être défini lors de l'utilisation deBuilder
.la source
Utilisez une mise en page personnalisée pour votre
DialogFragment
et ajoutez unLinearLayout
sous votre contenu qui peut être stylé comme sans bordure pour correspondre à Google Material Design. Recherchez ensuite les boutons nouvellement créés et remplacez-lesOnClickListener
.Exemple:
dialog_add_topic.xml :
Ceci est le résultat final.
la source
Il pourrait être construit de la manière la plus simple:
Boîte de dialogue d'alerte avec vue personnalisée et avec deux boutons (positif et négatif).
CustomClickLister du bouton positif du journal des alertes :
Terminé
la source
C'est probablement une réponse très tardive, mais l'utilisation de setCancelable fera l'affaire.
la source