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
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) { –
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
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éé :( –