Estoy anulando los métodos onCreateDialog y onPrepareDialog o la clase Dialog.Android: ocuparse de un diálogo en la orientación Cambio de la pantalla
He seguido el ejemplo del libro Desarrollo de aplicaciones para Android profesional de Reto Meier, Capítulo 5 para extraer algunos datos XML y luego usar un cuadro de diálogo para mostrar la información.
he seguido básicamente exactamente, pero cambió las variables para satisfacer mi propio esquema XML de la siguiente manera:
@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;
}
}
Funciona bien hasta que intento cambiar la orientación de la pantalla, Cuando hago este onPrepareDialog recibe una llamada pero obtengo excepciones de puntero nulo en todas mis variables.
El error aún se produce incluso cuando le digo a mi actividad que ignore la orientación de la pantalla en el manifiesto.
Supongo que algo ha quedado fuera del ejemplo en el libro. ¿Necesito anular otro método para guardar mis variables o algo así?
ahora han añadido los siguientes:
@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);
}
Pero sigo teniendo la excepción de puntero nulo
Hola seanhodges, que siguieron el ejemplo en el ejemplo de desbordamiento de pila que ha proporcionado, he añadido mi nuevo código a mi pregunta, pero todavía estoy recibiendo el puntero nulo en la línea exacta que mencionó - if (setting.getAddForPublicUserNames() == 1) { –
Hmm, esperaría que funcionara ahora. Intente pegar un punto de interrupción en su método onRestoreInstanceState() y asegúrese de que la "configuración" se está estableciendo antes de que el método onPrepareDialog() intente usarlo ... – seanhodges
Parece que mi objeto de configuración es la causa de los punteros nulos, No debe ser creado/guardado o algo así? Cambié todas mis variables para estar dentro de la clase y eliminé el uso del objeto de configuración y la aplicación funciona bien ahora. P el resto de la noche averiguando por qué mi objeto no se está guardando/creando :( –