Sto sovrascrivendo i metodi onCreateDialog e onPrepareDialog o la classe Dialog.Android - Gestione di una finestra di dialogo sullo schermo Modifica dell'orientamento
Ho seguito l'esempio del libro Sviluppo applicazioni Android Professional di Reto Meier, Capitolo 5 per estrarre alcuni dati XML e quindi utilizzare una finestra di dialogo per visualizzare le informazioni.
praticamente ho seguito esattamente ma ha cambiato le variabili per soddisfare il mio proprio schema XML come segue:
@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;
}
}
Funziona bene fino a che non provare a cambiare l'orientamento dello schermo, quando lo faccio questo onPrepareDialog riceve una chiamata ma ottengo eccezioni puntatore nullo su tutte le mie variabili.
L'errore si verifica ancora anche quando dico alla mia attività di ignorare l'orientamento dello schermo nel manifest.
Quindi presumo che qualcosa sia stato escluso dall'esempio del libro, ho bisogno di sovrascrivere un altro metodo per salvare le mie variabili o qualcosa del genere?
ora ho aggiunto il seguente:
@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);
}
Ma sto ancora ricevendo l'eccezione Null Pointer
Hi seanhodges, ho seguito l'esempio nell'esempio di overflow dello stack da Lei forniti, ho aggiunto il mio nuovo codice alla mia domanda, ma sto ancora ricevendo il puntatore nullo su la riga esatta che hai menzionato - if (setting.getAddForPublicUserNames() == 1) { –
Hmm, mi aspetterei che funzioni ora. Prova ad applicare un breakpoint nel tuo metodo onRestoreInstanceState() e assicurati che "setting" sia effettivamente impostato prima che il metodo onPrepareDialog() provi a utilizzarlo ... – seanhodges
Sembra che il mio oggetto di impostazione sia la causa dei puntatori nulli, Non deve essere creato/salvato o qualcosa del genere? Ho modificato tutte le mie variabili per rientrare nella classe e ho rimosso l'uso dell'oggetto di impostazione e l'app ora funziona correttamente. Q il resto della serata a capire perché il mio oggetto non viene salvato/creato :( –