2010-09-11 34 views
6

Comment faire pour restaurer le dialogue etc après avoir fait pivoter l'écran? Par exemple, affichez un alertDialog pour informer l'utilisateur. l'utilisateur fait ensuite pivoter l'écran vers une autre orientation. Comment restaurer le alertDialog? Quelqu'un peut-il me guider pour le faire? Merci!Android: Dialog etc restaurer après rotation a changé

Annexés plus tard:

J'ai regardé dans le code source Android et trouver ces choses:

Dialogs sont stockés dans mManagedDialogs, et les renseignements connexes sont:

mManagedDialogs = new SparseArray<ManagedDialog>(); 

onSaveInstanceState liés:

final void performSaveInstanceState(Bundle outState) { 
    onSaveInstanceState(outState); 
    saveManagedDialogs(outState); 
} 

Dans saveManagedDialogs, cela a quelque chose à voir avec mManagedDialogs.

onRestoreInstanceState connexes:

final void performRestoreInstanceState(Bundle savedInstanceState) { 
    onRestoreInstanceState(savedInstanceState); 
    restoreManagedDialogs(savedInstanceState); 
} 

En restoreManagedDialogs, il a quelque chose à voir avec mManagedDialogs.

Comme vous pouvez le voir, pour une fonctionnalité avancée, vous devez effectuer le travail de sauvegarde et de restauration par vous-même. Ce peut être une jument de nuit quand vous avez des tonnes de boîtes de dialogue personnalisées. Je n'ai pas essayé le dialogue complexe (a entré EdiText, listView, disons). De cette façon, je voudrais avertir les utilisateurs: Ne jamais faire pivoter l'écran lors de la saisie de vos informations dans la boîte de dialogue ... OU, verrouiller la rotation de façon dynamique lors de l'affichage de la boîte de dialogue.

Merci pour toutes les personnes qui m'ont répondu. J'espère que mes informations vous aideront aussi.

+1

Comment résoudre ce problème de nos jours: http://stackoverflow.com/a/15729764/842697 –

Répondre

-16

L'approche que j'ai adoptée était de ne pas permettre au système d'exploitation de redémarrer votre activité après la modification de la configuration de la mise en page. Pour ce faire, ajoutez cette ligne dans les activités que vous voulez éviter de redémarrer dans votre fichier manifeste:

<activity 
android:configChanges="orientation|keyboard" 
... 
> 

En option, vous pouvez gérer le changement de configuration dans le code dans le cas où il y a une mise en page les changements que vous voulez faire manuellement , comme recharger une nouvelle vue à partir de XML. Cela se fait en réécrivant la méthode onConfigurationChanged() dans votre classe d'activité:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    //Handle config changes here, paying attention to 
    //the newConfig.orientation value 
    super.onConfigurationChanged(newConfig); 
} 

Edit: Ajouté « | Clavier » à la liste des changements config

+0

Non, cette modification du fichier manifest arrête simplement Android de redémarrer votre activité lorsque cette configuration particulière changement (orientation) se produit. Cela n'arrêtera pas l'écran de tourner.Vous pouvez également ajouter un clavier pour les téléphones avec un clavier coulissant, car cela déclenchera également un redémarrage. –

+0

Vous avez raison! J'ai ajouté Android: configChanges = "orientation | clavier" et ça marche! Merci beaucoup! –

+13

Fonctionne mais non recommandé. –

5

Il est géré pour vous aussi longtemps que vous utiliser Activité showDialog pour montrer et Activité onCreateDialog pour le créer: http://developer.android.com/reference/android/app/Activity.html#showDialog%28int%29

http://developer.android.com/reference/android/app/Activity.html#onCreateDialog%28int,%20android.os.Bundle%29

+0

S'il vous plaît voir mon texte ajouté plus tard. –

+0

+1 pour cela. J'ai même été capable d'imbriquer mes boîtes de dialogue - le bouton positif de ma première boîte de dialogue lance une boîte de dialogue «Confirmer» car l'opération implique la suppression des données. – barry

+0

Déprécié dans l'API 13 ("Utiliser DialogFragment à la place") – Jeremy

-5

Ajouter comme ceci dans votre tag d'activité dans le manifeste

<activity android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|screenSize" android:name=".your.package"/>