Google recommande que nous utilisions DialogFragment
au lieu d'un simple Dialog
en utilisant Fragments API
, mais il est absurde d'utiliser un isolé DialogFragment
pour une simple boîte de message de confirmation Oui-Non. Quelle est la meilleure pratique dans ce cas?
244
Dialog
ouAlertDialog.Builder::create()::show()
créera une boîte de dialogue qui disparaît lorsque vous faites pivoter l'écran.Réponses:
Oui, utilisez
DialogFragment
etonCreateDialog
vous pouvez simplement utiliser un générateur AlertDialog pour créer un simpleAlertDialog
avec des boutons de confirmation Oui / Non. Pas beaucoup de code du tout.En ce qui concerne la gestion des événements dans votre fragment, il y aurait différentes façons de le faire, mais je définis simplement un message
Handler
dans myFragment
, le transmets auDialogFragment
via son constructeur, puis je retransmets les messages au gestionnaire de mon fragment en fonction des différents événements de clic. Encore une fois, différentes façons de le faire, mais ce qui suit fonctionne pour moi.Dans la boîte de dialogue, maintenez un message et instanciez-le dans le constructeur:
Implémentez le
onClickListener
dans votre boîte de dialogue, puis appelez le gestionnaire selon le cas:Éditer
Et comme il
Message
est parcellable, vous pouvez l'enregistreronSaveInstanceState
et le restaurerPuis dans
onCreate
la source
target
qui sera nul si vous le chargez depuis un bundle. Si la cible d'un Message est nulle et que vous l'utilisezsendToTarget
, vous obtiendrez une NullPointerException - non pas parce que le Message est nul, mais parce que sa cible l'est.Vous pouvez créer des sous-classes DialogFragment génériques comme YesNoDialog et OkDialog, et transmettre le titre et le message si vous utilisez beaucoup de boîtes de dialogue dans votre application.
Appelez-le ensuite comme suit:
Et gérez le résultat
onActivityResult
.la source
YES_NO_CALL
,getFragmentManager()
etonActivityResult
?YES_NO_CALL
est un int personnalisé qui est le code de demande.getFragmentManager()
obtient le gestionnaire de fragments pour l'activité etonActivityResult()
est une méthode de rappel de cycle de vie de fragment.Utilisez DialogFragment sur AlertDialog:
Depuis l'introduction de l'API niveau 13 :
la méthode showDialog de Activity est déconseillée . Il n'est pas conseillé d'invoquer une boîte de dialogue ailleurs dans le code car vous devrez gérer la boîte de dialogue vous-même (par exemple, changement d'orientation).
Dialogue de différence - Fragment - AlertDialog
Sont-ils tellement différents? De la référence Android concernant DialogFragment :
Autres notes
la source
Je recommanderais d'utiliser
DialogFragment
.Bien sûr, la création d'une boîte de dialogue "Oui / Non" avec elle est assez complexe étant donné que cela devrait être une tâche plutôt simple, mais la création d'une boîte de dialogue similaire avec
Dialog
est également étonnamment compliquée.(Le cycle de vie des activités complique les choses - vous devez laisser
Activity
gérer le cycle de vie de la boîte de dialogue - et il n'y a aucun moyen de transmettre des paramètres personnalisés, par exemple le message personnalisé,Activity.showDialog
si vous utilisez des niveaux d'API inférieurs à 8)La bonne chose est que vous pouvez généralement construire votre propre abstraction par dessus
DialogFragment
assez facilement.la source
String
paramètre. Lorsque l'utilisateur clique sur "Oui", par exemple, la boîte de dialogue appelle la méthode de l'activité avec le paramètre "d'accord". Ces paramètres sont spécifiés lors de l'affichage de la boîte de dialogue, par exemple AskDialog.ask ("Êtes-vous d'accord avec ces termes?", "D'accord", "en désaccord");FragmentManager
'sfindFragmentByTag
. Mais oui, cela nécessite un peu de code.Fragment
this
et avoir votreActivity
extends
votreInterface
. Attention au threading cependant, vous pouvez sauter des appels d'interface lorsque vous n'en voulez pas nécessairement si votre concurrence n'est pas en échec. Vous n'êtes pas sûr de ce que cela fait avec la mémoire et les spaghettis de dépendance circulaire, est-ce que quelqu'un d'autre aimerait jouer? L'autre option estMessage
/Handler
mais vous pouvez toujours rencontrer des problèmes de concurrence.Generic AlertDialogFragment avec Builder Pattern
Dans mon projet, j'en utilisais
AlertDialog.Builder
déjà déjà beaucoup avant de découvrir que c'était problématique. Cependant, je ne voulais pas changer autant de code n'importe où dans mon application. De plus, je suis en fait un fan de passerOnClickListeners
en classes anonymes là où elles sont nécessaires (c'est-à-dire lors de l'utilisationsetPositiveButton()
,setNegativeButton()
etc.) au lieu d'avoir à implémenter des milliers de méthodes de rappel pour communiquer entre un fragment de dialogue et le fragment de support, ce qui peut, dans à mon avis, conduire à un code très déroutant et complexe. Surtout, si vous avez plusieurs boîtes de dialogue différentes dans un fragment et que vous devez ensuite distinguer dans les implémentations de rappel quelle boîte de dialogue est actuellement affichée.Par conséquent, j'ai combiné différentes approches pour créer une
AlertDialogFragment
classe d'assistance générique qui peut être utilisée exactement commeAlertDialog
:SOLUTION
( VEUILLEZ NOTER que j'utilise des expressions lambda Java 8 dans mon code, vous devrez donc peut-être modifier des parties du code si vous n'utilisez pas encore d' expressions lambda .)
USAGE
Je poste ceci ici non seulement pour partager ma solution, mais aussi parce que je voulais vous demander votre opinion: cette approche est-elle légitime ou problématique dans une certaine mesure?
la source
Puis-je suggérer une petite simplification de la réponse de @ ashishduh:
Il supprime la nécessité pour l'utilisateur (de la classe) de se familiariser avec les composants internes du composant et rend l'utilisation très simple:
PS Dans mon cas, j'avais besoin d'une simple boîte de dialogue d'alerte, c'est donc ce que j'ai créé. Vous pouvez appliquer l'approche à un type Oui / Non ou à tout autre type dont vous avez besoin.
la source
Utilisez Dialogue pour des dialogues simples oui ou non.
Lorsque vous avez besoin de vues plus complexes dans lesquelles vous devez vous procurer le cycle de vie, comme oncreate, demander des autorisations, tout remplacement de cycle de vie, j'utiliserais un fragment de dialogue. Ainsi, vous séparez les autorisations et tout autre code dont la boîte de dialogue a besoin pour fonctionner sans avoir à communiquer avec l'activité d'appel.
la source