J'essaie d'empêcher les boîtes de dialogue créées avec Alert Builder d'être fermées lorsque l'activité est redémarrée.
Si je surcharge la méthode onConfigurationChanged, je peux le faire avec succès et réinitialiser la mise en page pour une orientation correcte, mais je perds la fonction de texte collant d'edittext. Donc, en résolvant le problème de dialogue, j'ai créé ce problème edittext.
Si j'enregistre les chaînes de l'edittext et que je les réaffecte dans le changement onCofiguration, elles semblent toujours avoir par défaut la valeur initiale et non ce qui a été entré avant la rotation. Même si je force une invalidation semble les mettre à jour.
J'ai vraiment besoin de résoudre soit le problème de dialogue, soit le problème edittext.
Merci pour l'aide.
Réponses:
La meilleure façon d'éviter ce problème de nos jours est d'utiliser un fichier
DialogFragment
.Créez une nouvelle classe qui s'étend
DialogFragment
. RemplacezonCreateDialog
et renvoyez votre ancienDialog
ou un fichierAlertDialog
.Ensuite, vous pouvez le montrer avec
DialogFragment.show(fragmentManager, tag)
.Voici un exemple avec un
Listener
:Et dans l'activité que vous appelez:
Cette réponse aide à expliquer ces trois autres questions (et leurs réponses):
la source
onAttach
c'est obsolète maintenant. Que faut-il faire à la place?onAttach(Context context)
etandroid.support.v4.app.DialogFragment
. LaonAttach
méthode prend lacontext
place deactivity
comme paramètre maintenant.YesNoListener
. Voyez cette réponse .la source
Context
intérieur des boutons de la boîte de dialogueOnClickListener
.Si vous modifiez la mise en page lors du changement d'orientation, je ne mettrais pas
android:configChanges="orientation"
dans votre manifeste parce que vous recréez les vues de toute façon.Enregistrez l'état actuel de votre activité (comme le texte saisi, la boîte de dialogue affichée, les données affichées, etc.) en utilisant ces méthodes:
De cette façon, l'activité passe à nouveau par onCreate et appelle ensuite la méthode onRestoreInstanceState dans laquelle vous pouvez redéfinir votre valeur EditText.
Si vous souhaitez stocker des objets plus complexes, vous pouvez utiliser
Ici, vous pouvez stocker n'importe quel objet et dans onCreate, il vous suffit d'appeler
getLastNonConfigurationInstance();
pour obtenir l'objet.la source
OnRetainNonConfigurationInstance()
est maintenant obsolète comme le dit le Doc: developer.android.com/reference/android/app/…setRetainInstance(boolean retain)
devrait être utilisé à la place: developer.android.com/reference/android/app/…setRetainInstance
est complètement différent: c'est pour les fragments et cela ne vous garantit pas que l'instance sera conservée.Ajoutez simplement android: configChanges = "orientation" avec votre élément d'activité dans AndroidManifest.xml
Exemple:
la source
Une approche très simple consiste à créer les boîtes de dialogue à partir de la méthode
onCreateDialog()
(voir la remarque ci-dessous). Vous leur montrez à traversshowDialog()
. De cette façon, Android gère la rotation pour vous et vous ne devez pas appelerdismiss()
àonPause()
éviter une WindowLeak et vous ne devez restaurer la boîte de dialogue. À partir de la documentation:Voir la documentation Android showDialog () pour plus d'informations. J'espère que cela aide quelqu'un!
Remarque: si vous utilisez AlertDialog.Builder, n'appelez pas
show()
depuisonCreateDialog()
, appelez à lacreate()
place. Si vous utilisez ProgressDialog, créez simplement l'objet, définissez les paramètres dont vous avez besoin et renvoyez-le. En conclusion, à l'show()
intérieuronCreateDialog()
cause des problèmes, créez simplement une instance de Dialog et renvoyez-la. Cela devrait fonctionner! (J'ai rencontré des problèmes lors de l'utilisation de showDialog () de onCreate () - qui n'affiche pas la boîte de dialogue -, mais si vous l'utilisez dans onResume () ou dans un rappel d'auditeur, cela fonctionne bien).la source
AlertDialog.Builder
. Si vous l'utilisez à l'intérieuronCreateDialog()
, au lieu d'utiliser,show()
retournez le résultat decreate()
. Sinon, appelezshow()
et stockez le AlertDialog retourné dans un attribut de l'activité et dansonPause()
dismiss()
celui-ci s'il est affiché afin d'éviter un WindowLeak. J'espère que ça aide!Cette question a reçu une réponse il y a longtemps.
Pourtant, c'est une solution simple et non piratée que j'utilise pour moi-même.
J'ai fait cette classe d'aide pour moi-même, vous pouvez donc l'utiliser également dans votre application.
L'utilisation est:
Ou
la source
Vous pouvez combiner les méthodes onSave / onRestore de Dialog avec les méthodes onSave / onRestore de Activity pour conserver l'état du Dialog.
Remarque: Cette méthode fonctionne pour ces boîtes de dialogue "simples", telles que l'affichage d'un message d'alerte. Il ne reproduira pas le contenu d'une WebView intégrée dans une boîte de dialogue. Si vous voulez vraiment empêcher une boîte de dialogue complexe d'être rejetée pendant la rotation, essayez la méthode de Chung IW.
la source
Certainement, la meilleure approche consiste à utiliser DialogFragment.
Voici ma solution de classe wrapper qui aide à empêcher que différentes boîtes de dialogue soient rejetées dans un fragment (ou une activité avec une petite refactorisation). En outre, cela permet d'éviter une refactorisation massive du code si, pour certaines raisons, il y en a beaucoup
AlertDialogs
dispersés dans le code avec de légères différences entre eux en termes d'actions, d'apparence ou autre.En ce qui concerne l'activité, vous pouvez l'invoquer à l'
getContext()
intérieuronCreateDialog()
, la lancer dans l'DialogProvider
interface et demander une boîte de dialogue spécifique parmDialogId
. Toute logique de traitement d'un fragment cible doit être supprimée.Utilisation à partir du fragment:
Vous pouvez lire l'article complet sur mon blog Comment éviter que Dialog ne soit rejeté? et jouez avec le code source .
la source
Il semble que ce soit toujours un problème, même lorsque "tout faire correctement" et utiliser
DialogFragment
etc.Il existe un fil de discussion sur Google Issue Tracker qui prétend que cela est dû à un ancien message de rejet laissé dans la file d'attente des messages. La solution de contournement fournie est assez simple:
Incroyable que cela soit encore nécessaire 7 ans après le premier signalement de ce problème.
la source
J'ai eu un problème similaire: lorsque l'orientation de l'écran a changé, l'
onDismiss
écouteur de la boîte de dialogue a été appelé même si l'utilisateur n'a pas fermé la boîte de dialogue. J'ai pu contourner ce problème en utilisant plutôt l'onCancel
auditeur, qui s'est déclenché à la fois lorsque l'utilisateur a appuyé sur le bouton de retour et lorsque l'utilisateur a touché en dehors de la boîte de dialogue.la source
Juste utiliser
et l'application saura comment gérer la rotation et la taille de l'écran.
la source