2010-06-10 10 views
10

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

risposta

4

non ho il libro di Reto quindi non posso controllare il codice, ma se c'è un errore nel libro si può facilmente contattare lui su Twitter per discuterne: http://twitter.com/retomeier

Ricorda che se l'orientamento dello schermo cambia, la tua attività viene ricreata. Ciò significa che tutte le variabili impostate l'ultima volta, che non sono statiche, andranno perse dopo che l'attività è stata ricreata con il nuovo orientamento.

La mia ipotesi è che si colpisce un NullPointerException qui:

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

Se è così, è più probabile che una certa azione utente modifica la variabile "impostazione" per qualcosa di diverso da null - è necessario assicurarsi che questo viene reimpostato quando viene ricreata l'attività.

Il metodo più standard per memorizzare/recuperare lo stato di attività tra gli orientamenti è dettagliata qui: Saving Android Activity state using Save Instance State

+0

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

+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

+0

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

2

Quando si cambia orientamento, Android riavviare la vostra attività, è necessario per salvare la proprietà con

onSaveInstanceState 

e recuperare con

savedInstanceState 
0

Se non si desidera che l'attività da ricreato quando cambia l'orientamento. Inserisci la seguente riga in AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation 

esempio:

<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

Per me questa risposta è stato il modo più veloce per correggere tutti i bug relativi al cambio di orientamento dello schermo. io mentre integro le finestre di dialogo di Facebook! L'utente può ancora usare la tastiera hardware. – OneWorld

+10

Potrebbe sembrare che funzioni, ma nasconde solo il problema. – rf43

Problemi correlati