Question

Je suis Dérogation des méthodes onCreateDialog et onPrepareDialog ou la classe de dialogue.

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 suivi exactement mais 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'essayez de changer l'orientation de l'écran, Quand je fais onPrepareDialog GARDERA mais je reçois des exceptions de pointeur nul sur toutes mes variables.

L'erreur se produit toujours même quand je dis à mon activité d'ignorer l'orientation de l'écran dans le manifeste.

Alors que je presume de a été laissé sur 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

Était-ce utile?

La solution

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 les changements d'orientation de l'écran, 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 perdus après l'activité est sous la recréée nouvelle orientation.

Je suppose que vous frappez un NullPointerException ici:

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

Dans ce cas, il est fort probable qu'une action utilisateur modifie la variable « réglage » autre chose que nul -. Vous devez vous assurer que ce paramètre est réglé à nouveau lorsque l'activité est recréée

La méthode la plus classique pour stocker / récupérer l'état d'activité entre les orientations est détaillée ici: Sauvegarde état Activité Android avec STOCKER État instance

Autres conseils

Lorsque vous modifiez l'orientation, androïde redémarrer votre activité, vous devez enregistrer le domaine avec

onSaveInstanceState

et récupérer avec

savedInstanceState

Si vous ne voulez pas l'activité à recréée en cas de changement d'orientation. Insérez la ligne suivante dans le 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>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top