Empêcher le renvoi de la boîte de dialog lors de la rotation de l’écran dans Android

J’essaie d’empêcher que les boîtes de dialog créées avec le générateur Alerte ne soient supprimées au redémarrage de l’activité.

Si je surcharge la méthode onConfigurationChanged, je peux le faire correctement et réinitialiser la mise en page pour corriger l’orientation, mais je perds la fonctionnalité de texte collant d’edittext. Donc, en résolvant le problème de dialog, j’ai créé ce problème edittext.

Si je sauvegarde les chaînes du fichier edittext et que je les réaffecte dans le changement onCofiguration, elles semblent toujours avoir une valeur initiale par défaut, pas celle qui a été entrée avant la rotation. Même si je force une invalidation, elle semble les mettre à jour.

J’ai vraiment besoin de résoudre le problème de dialog ou le problème d’edittext.

Merci pour l’aide.

    La meilleure façon d’éviter ce problème est d’utiliser un DialogFragment .

    Créez une nouvelle classe qui étend DialogFragment . Remplacez onCreateDialog et retournez votre ancien Dialog ou un AlertDialog .

    Ensuite, vous pouvez l’afficher avec DialogFragment.show(fragmentManager, tag) .

    Voici un exemple avec un Listener :

     public class MyDialogFragment extends DialogFragment { public interface YesNoListener { void onYes(); void onNo(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof YesNoListener)) { throw new ClassCastException(activity.toSsortingng() + " must implement YesNoListener"); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle(R.ssortingng.dialog_my_title) .setMessage(R.ssortingng.dialog_my_message) .setPositiveButton(android.R.ssortingng.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((YesNoListener) getActivity()).onYes(); } }) .setNegativeButton(android.R.ssortingng.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((YesNoListener) getActivity()).onNo(); } }) .create(); } } 

    Et dans l’activité que vous appelez:

     new MyDialogFragment().show(getSupportFragmentManager(), "tag"); // or getFragmentManager() in API 11+ 

    Cette réponse aide à expliquer ces trois autres questions (et leurs réponses):

    • Android Meilleur moyen d’éviter Dialogues à rejeter après une rotation de l’appareil
    • DialogFragment Android vs Dialog
    • Comment afficher un DialogFragment en utilisant un package de compatibilité?
     // Prevent dialog dismiss when orientation changes private static void doKeepDialog(Dialog dialog){ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(dialog.getWindow().getAtsortingbutes()); lp.width = WindowManager.LayoutParams.WRAP_CONTENT; lp.height = WindowManager.LayoutParams.WRAP_CONTENT; dialog.getWindow().setAtsortingbutes(lp); } 
     public static void doLogout(final Context context){ final AlertDialog dialog = new AlertDialog.Builder(context) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(R.ssortingng.titlelogout) .setMessage(R.ssortingng.logoutconfirm) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ... } }) .setNegativeButton("No", null) .show(); doKeepDialog(dialog); } 

    Si vous modifiez la disposition du changement d’orientation, je ne mettrai pas android:configChanges="orientation" dans votre manifeste car vous android:configChanges="orientation" les vues de toute façon.

    Enregistrez l’état actuel de votre activité (comme le texte entré, la boîte de dialog affichée, les données affichées, etc.) en utilisant ces méthodes:

     @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } 

    De cette façon, l’activité passe à nouveau sur onCreate et appelle ensuite la méthode onRestoreInstanceState où vous pouvez redéfinir votre valeur EditText.

    Si vous souhaitez stocker des objects plus complexes, vous pouvez utiliser

     @Override public Object onRetainNonConfigurationInstance() { } 

    Ici, vous pouvez stocker n’importe quel object et dans onCreate, il vous suffit d’appeler getLastNonConfigurationInstance(); pour obtenir l’object.

    Il suffit d’append android: configChanges = “orientation” avec votre élément d’activité dans AndroidManifest.xml

    Exemple: