2010-06-10 15 views
10

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

Respuesta

4

no tengo el libro de Reto por lo que no se puede comprobar el código, pero si hay un error en el libro le puede contactar fácilmente en Twitter para hablar de ello: http://twitter.com/retomeier

Recuerde que si la orientación de la pantalla cambia, su actividad se vuelve a crear. Esto significa que cualquier variable que establezca la última vez, que no sea estática, se perderá después de que la actividad sea recreada bajo la nueva orientación.

Mi conjetura es que usted golpea una NullPointerException aquí:

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

Si es así, lo más probable es que alguna acción del usuario cambia el "ajuste" variable para algo que no sea nulo - que necesita para asegurarse de que esto se establece de nuevo cuando se recrea la actividad.

El método más estándar para almacenar/recuperar el estado de actividad entre las orientaciones se detalla aquí: Saving Android Activity state using Save Instance State

+0

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) { –

+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

+0

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 :( –

2

Cuando cambia la orientación, Android reinicie su actividad, lo que necesita para guardar la propiedad con

onSaveInstanceState 

y recuperar con

savedInstanceState 
0

Si no desea que la actividad a crear cuando los cambios de orientación. Inserta la siguiente línea en AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation 

ejemplo:

<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>

+0

Para mí, esta respuesta fue la forma más rápida de corregir todos los errores relacionados con el cambio de orientación de la pantalla. ¡mientras integraba los diálogos de Facebook! El usuario aún puede usar el teclado de hardware. – OneWorld

+10

Puede "parecer" que funciona, pero solo oculta el problema. – rf43

Cuestiones relacionadas