2010-06-10 18 views
10

Je remplace les méthodes onCreateDialog et onPrepareDialog ou la classe Dialog.Android - Traitement d'une modification de l'orientation de la boîte de dialogue à l'écran

J'ai suivi l'exemple du livre Application Android professionnelle Développement de Reto Meier, chapitre 5 pour tirer des données XML et utiliser une boîte de dialogue pour afficher les informations.

J'ai essentiellement exactement mais suivi changé les variables en fonction de mon propre schéma XML comme suit:


@Override 
public Dialog onCreateDialog(int id) { 
    switch(id) { 
    case (SETTINGS_DIALOG) :   
     LayoutInflater li = LayoutInflater.from(this); 
     View settingsDetailsView = li.inflate(R.layout.details, null); 

     AlertDialog.Builder settingsDialog = new AlertDialog.Builder(this); 
     settingsDialog.setTitle("Provisioned Settings");   
     settingsDialog.setView(settingsDetailsView); 
return settingsDialog.create(); 
    } 
    return null; 
} 

@Override 
public void onPrepareDialog(int id, Dialog dialog) { 
    switch(id) { 
    case (SETTINGS_DIALOG) :     

String afpunText = " "; 

    if(setting.getAddForPublicUserNames() == 1){ 
     afpunText = "Yes"; 
    } 
    else{ 
     afpunText = "No"; 
    } 
     String Text = "Login Settings: " + "\n" 
         + "Password: " + setting.getPassword() + "\n" 
         + "Server: " + setting.getServerAddress() + "\n"; 


     AlertDialog settingsDialog = (AlertDialog)dialog; 
settingsDialog.setTitle(setting.getUserName()); 

tv = (TextView)settingsDialog.findViewById(R.id.detailsTextView); 
if (tv != null) 
     tv.setText(Text); 

     break; 
    } 
} 

Il fonctionne très bien jusqu'à ce que j'essaie de changer l'orientation de l'écran, Quand je fais cette onPrepareDialog reçoit un appel mais j'obtiens des exceptions de pointeur nulles sur toutes mes variables.

L'erreur persiste même lorsque je dis à mon activité d'ignorer l'orientation de l'écran dans le manifeste.

Je suppose que quelque chose a été omis de l'exemple dans le livre ai-je besoin de passer outre une autre méthode pour enregistrer mes variables ou quelque chose?

J'ai maintenant ajouté ce qui suit:


@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save UI state changes to the savedInstanceState. 
    // This bundle will be passed to onCreate if the process is 
    // killed and restarted. 
    savedInstanceState.putString("Username", setting.getUserName()); 
    savedInstanceState.putString("Password", setting.getPassword()); 
    savedInstanceState.putString("Server", setting.getServerAddress()); 

    super.onSaveInstanceState(savedInstanceState); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    settings.clear(); 
    // Restore UI state from the savedInstanceState. 
    // This bundle has also been passed to onCreate. 
    username = savedInstanceState.getString("Username"); 
    password = savedInstanceState.getString("Password"); 
    serveraddress = savedInstanceState.getString("Server"); 


Settings setting = new Settings(username, password, serveraddress); 
addNewSettings(setting); 

} 

Mais je reçois toujours l'exception de pointeur nul

Répondre

4

Je n'ai pas le livre de Reto je ne peux pas vérifier le code, mais s'il y a une erreur dans le livre que vous pouvez le contacter facilement sur Twitter pour en discuter: http://twitter.com/retomeier

Rappelez-vous que si l'orientation de l'écran change, votre activité est recréée. Cela signifie que toutes les variables que vous définissez la dernière fois, qui ne sont pas statiques, seront perdues après la recréation de l'activité sous la nouvelle orientation.

Je pense que vous frappez un NullPointerException ici:

if(setting.getAddForPublicUserNames() == 1){ 

Si oui, il est fort probable qu'une action utilisateur change la variable « réglage » autre chose que nul - vous devez vous assurer que cette est défini à nouveau lorsque l'activité est recréée.

La méthode la plus standard pour stocker/récupérer l'état d'activité entre les orientations sont détaillées ici: Saving Android Activity state using Save Instance State

+0

Salut seanhodges, j'ai suivi l'exemple dans l'exemple de débordement de pile que vous avez fourni, j'ai ajouté mon nouveau code à ma question mais je reçois toujours le pointeur nul sur la ligne exacte que vous avez mentionnée - if (setting.getAddForPublicUserNames() == 1) { –

+1

Hmm, je m'attendrais à ce que ça marche maintenant. Essayez de coller un point d'arrêt dans votre méthode onRestoreInstanceState() et assurez-vous que "setting" est réellement défini avant que la méthode onPrepareDialog() essaie de l'utiliser ... – seanhodges

+0

Il semblerait que mon objet de paramétrage soit la cause des pointeurs NULL, Il ne doit pas être créé/enregistré ou quelque chose? J'ai changé toutes mes variables pour être dans la classe et supprimé l'utilisation de l'objet de réglage et l'application fonctionne bien maintenant. Q le reste de la soirée à comprendre pourquoi mon objet n'est pas sauvegardé/créé :( –

2

Lorsque vous changez l'orientation, androïde redémarrer votre activité, vous avez besoin pour sauver la propriété avec

onSaveInstanceState 

et récupérer avec

savedInstanceState 
0

Si vous ne voulez pas l'activité à recréés en cas de changement d'orientation. Insérez la ligne suivante dans le fichier AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation 

exemple:

<activity android:name=".FABSLogin" android:label="@string/app_name" android:theme="@style/Theme.NoWindowTitle" android:noHistory="true" **android:configChanges="keyboardHidden|orientation**"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

+0

Pour moi, cette réponse a été le moyen le plus rapide de corriger tous les bugs liés au changement d'orientation de l'écran. moi tout en intégrant des dialogues Facebook! L'utilisateur peut toujours utiliser le clavier matériel – OneWorld

+10

Cela peut "sembler" fonctionner mais ne fait que masquer le problème. – rf43