Android - Traitement d'une modification de l'orientation de la boîte de dialogue sur l'écran
Je suis substitution de la onCreateDialog et onPrepareDialog de méthodes ou de la classe de boîte de Dialogue.
J'ai suivi l'exemple de Reto Meier Professionnel du Développement d'Applications Android livre, le Chapitre 5 de tirer des données XML et ensuite utiliser une boîte de dialogue pour afficher l'info.
J'ai suivi exactement, mais il a changé les variables pour l'adapter à 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'ai essayer de changer l'orientation de l'écran, Quand je fais ce onPrepareDialog obtient appeler mais je reçois pointeur null exceptions sur toutes mes variables.
L'erreur se produit toujours, même quand je dire à mon activité d'ignorer l'orientation de l'écran dans le manifeste.
Donc je suppose que quelque chose a été laissé de côté de l'exemple dans le livre que j'ai besoin de remplacer 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 suis encore en train de l'exception de Pointeur Null
source d'informationauteur Donal Rafferty
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas de Reto livre donc je ne peux pas vérifier le code, mais si il y a une erreur dans le livre, 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 l'activité est recréée en vertu de la nouvelle orientation.
Ma conjecture est que vous avez touché un NullPointerException ici:
Si oui, il est plus que probable qu'une action de l'utilisateur modifie le "réglage" de la variable à une valeur différente de null - vous besoin pour s'assurer que cela est nouveau lorsque l'activité est recréée.
Les plus méthode standard pour stocker/récupérer l'activité de l'état entre les orientations est détaillée ici: D'économie d'Android Activité de l'état à l'aide d'Enregistrer l'État de l'Instance
Lorsque vous changez l'orientation, android redémarrer votre activité, vous avez besoin pour économiser de l'immobilier avec
et de récupérer
Si vous ne voulez pas que l'activité soit recréé lors de changements d'orientation. Insérez la ligne suivante dans le AndroidManifest.xml.
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>