Android DialogFragment vs Dialogue
Google recommande que nous utilisons DialogFragment
au lieu d'un simple Dialog
en utilisant Fragments API
, mais il est absurde d'utiliser un isolé DialogFragment
pour un simple Oui-Pas de boîte de message de confirmation. Quelle est la meilleure pratique dans ce cas?
- En bref, entre autres choses, simple
Dialog
ouAlertDialog.Builder::create()::show()
va créer une boîte de dialogue qui disparaît lorsque vous faites pivoter l'écran.
Vous devez vous connecter pour publier un commentaire.
Oui, l'utilisation
DialogFragment
et dansonCreateDialog
vous pouvez simplement utiliser un AlertDialog générateur de toute façon à créer un simpleAlertDialog
avec Oui/Non confirmation de boutons. Pas beaucoup de code.En ce qui concerne la gestion des événements dans votre fragment il y aurait différentes façons de le faire, mais j'ai simplement définir un message
Handler
dans monFragment
, la passer dans leDialogFragment
par l'intermédiaire de son constructeur et ensuite passer des messages de retour de mon fragment du gestionnaire comme approprirate sur les différents événements de clic. De nouveau les différentes façons de le faire, mais la suivante fonctionne pour moi.Dans la boîte de dialogue contiennent un message et de l'instancier dans le constructeur:
Mettre en œuvre les
onClickListener
dans votre boîte de dialogue, puis l'appel du gestionnaire selon le cas:Modifier
Et comme
Message
est parcelable vous pouvez l'enregistrer dansonSaveInstanceState
et restaurerPuis dans
onCreate
Message
à l'aide deputParcelable
n'enregistre pas sa cible. Lorsque vous restaurez le message et essayer de l'envoyer plus tard à l'aide desendToTarget()
vous obtiendrez unNullPointerException
.onCreate
j'ai misokMessage
du lot si elle est non nulle. De cette manière, mesokMessage
est toujours non nulle, et cela fonctionne pour moi.target
qui sera null si vous le charger à partir d'un Bundle. Si la cible d'un Message est nul, et que vous utilisezsendToTarget
, vous obtiendrez un NullPointerException - non pas parce que le Message est nul, mais parce que la cible est.target
est null. MonokMessage
est non nulle, une fois chargé à partir du bundle et ensuite en cliquant sur, avec bonheur, envoie le message à mon fragment du gestionnaire.Vous pouvez créer des génériques DialogFragment sous-classes comme YesNoDialog et OkDialog, et de passer dans le titre et le message si vous utiliser des boîtes de dialogue beaucoup dans votre application.
Ensuite l'appeler à l'aide:
Et gérer le résultat dans
onActivityResult
.setTargetFragment
utiliseFragmentManager
méthodes pour conserver l'état de Fragments.YES_NO_CALL
,getFragmentManager()
etonActivityResult
?YES_NO_CALL
est une coutume int qui est le code de la demande.getFragmentManager()
obtient le fragment manager de l'activité, etonActivityResult()
est un fragment du cycle de vie de la méthode de rappel.setArguments()
seront conservés à travers le fragment de la détruire et de la création.AlertDialog
.Utilisation DialogFragment sur AlertDialog:
Depuis l'introduction de l'API de niveau 13:
la showDialog méthode de l'Activité est obsolète.
L'invocation d'une boîte de dialogue d'ailleurs dans le code n'est pas conseillé, car vous aurez à gérer la boîte de dialogue vous (par exemple, changement d'orientation).
Différence DialogFragment - AlertDialog
Sont-ils tellement différents? De Android de référence concernant DialogFragment:
Autres notes
Je vous conseille d'utiliser
DialogFragment
.Sûr, la création d'un "Oui/Non" dialogue avec elle est assez complexe, compte tenu qu'il devrait être plutôt facile, mais la création d'une boîte de dialogue similaire à cocher avec
Dialog
est étonnamment compliqué ainsi.(Activité du cycle de vie qui le rend complexe - il faut laisser
Activity
gérer le cycle de vie de la boîte de dialogue - et il n'y a aucun moyen de passer des paramètres personnalisés, par exemple, le message personnalisé àActivity.showDialog
si l'aide de l'API niveaux de moins de 8)La bonne chose est que, généralement, vous pouvez construire votre propre abstraction sur le dessus de
DialogFragment
assez facilement.String
paramètre. Lorsque l'utilisateur clique sur "Oui", par exemple, la boîte de dialogue des appels de la méthode 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 à ces conditions?", "d'accord", "pas d'accord");FragmentManager
'sfindFragmentByTag
. Mais oui, il nécessite un peu juste de code.Fragment
this
et votreActivity
extends
votreInterface
. Attention de filetage cependant, vous pourriez être l'éclate d'appels d'interface lorsque vous n'avez pas forcément envie si votre simultanéité n'est pas en échec. Pas sûr de ce que cela fait avec de la mémoire et de la dépendance circulaire spaghetti cependant, serait une personne comme à carillon? L'autre option estMessage
/Handler
mais vous pouvez toujours avoir des problèmes de concurrence.Je vous propose un peu de simplification de @ashishduh réponse:
Il supprime la nécessité pour l'utilisateur (de la classe) pour être familier avec le fonctionnement interne du composant, et rend l'utilisation très simple:
P. S. Dans mon cas, j'avais besoin d'une simple boîte de dialogue d'alerte de sorte que ce que j'ai créé. Vous pouvez appliquer l'approche à un Oui/Non, ou tout autre type dont vous avez besoin.