2009-02-25 5 views
19

Sto utilizzando Intents per passare da un'attività all'altra nella mia app per Android. Sto mettendo i dati nell'intento per l'uso nella prossima attività. Quando accendo il telefono tra le modalità orizzontale e verticale, i valori passati dall'intento vengono persi e viene visualizzata una NullPointerException.Android: il passaggio tra la modalità orizzontale e verticale rende Inten. Valori persi

Qualcuno può dirmi cosa potrebbe essere sbagliato.

C'è molto codice per postarlo interamente. Ma se qualcuno ha bisogno di guardare parti specifiche del codice, posso postarlo qui.

Modifica
Ho risolto il problema dello stato non salvato. Ma un altro problema che ho dovuto affrontare è che nessuno dei pulsanti sullo schermo funziona dopo che l'orientamento è stato modificato. Alla pressione del pulsante, ottengo questo avviso in LogCat

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0 

Si prega di aiuto.

risposta

23

Quando si cambia orientamento, l'attività viene ricreata e onCreate viene richiamato, quindi è necessario utilizzare il pacchetto per salvare lo stato corrente e ripristinarlo dopo un cambio di orientamento. Puoi vedere questo in azione se hai solo un'app con TextView e inserisci testo e cambia orientamento. Se impacchetta il tuo stato per onCreate, puoi fermarlo. Questo è probabilmente anche il motivo per cui hai un NullPointer dopo che l'orientamento è cambiato. È fastidioso come l'inferno, ma qualcosa con cui dobbiamo convivere.

This collegamento su una serie di tutorial di orientamento e this first one in particolare dovrebbe aiutarti a capire esattamente cosa sta succedendo e come mantenere correttamente il tuo stato attuale.

Aggiornamento: C'è anche un post su SO Activity restart on rotation Android che si occupa quasi della stessa cosa.

Modifica per il follow-up domanda:

Hai ricollegare i gestori di clic dopo il cambio di orientamento?

+0

Perché l'ultima domanda? È importante riattaccare gli ascoltatori? Per favore mi faccia sapere. :) –

+0

Sì, perché se non li ricolleghi saranno comunque collegati ai vecchi pulsanti che non esistono più. –

+1

+1 grazie! Sono rimasto bloccato con questo errore per l'ultima ora. Sono arrivato a detestare davvero lo sviluppo Android! Complifica le cose banali. –

5

Prova questo:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(SOME_KEY, "blah blah blah"); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    somevalue = savedInstanceState.getString(SOME_KEY); 
    ... 
} 
3

possibile dichiarare un androide attributo: configChanges con il valore di "orientamento", questo impedirà l'attività di essere riavviato. Invece, l'attività rimane in esecuzione e viene chiamato il suo metodo onConfigurationChanged().

+0

Aggiungi questo è al tag attività – sami

8

Scrivi questo nella vostra file..in manifesta quale attività si desidera questo--

android:configChanges="orientation|keyboardHidden" 

Modificato: Utilizzare questo per nuove API versions--

android:configChanges="orientation|keyboardHidden|screenSize" 

Sicuramente lo farà lavoro ..

+0

Questo è stato elaborato nell'emulatore. Ma non ha funzionato nel dispositivo reale. – enadun

+0

Funzionerà anche su dispositivi reali. Assicurati di averlo aggiunto all'attività su cui si verifica il problema. – Hulk

+0

non ha funzionato !!!! –

1

Dichiarare < android:configChanges="orientation|keyboardHidden"/> nel file manifest. Questo ti consente di gestire da solo la modifica della visibilità di Orientamento/Tastiera. Ovviamente, non è necessario sovrascrivere il metodo di callback per gestirlo.

0

Ciao Ho anche riscontrato questo problema. quello fisso che per me è stato:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putString("Username", mUsername); 
    savedInstanceState.putString("Password", mPassword); 
    savedInstanceState.putString("UserID", mUserID); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

e poi in onCreate():

if (savedInstanceState == null) { 
    Bundle extras = getIntent().getExtras(); 
    if(extras == null) { 
     mUsername = "?"; 
     mPassword = "?"; 
     mUserID = "?"; 
    } else { 
     mUsername = extras.getString("Username"); 
     mPassword = extras.getString("Password"); 
     mUserID = extras.getString("UserID"); 
    } 
} else { 
    mUsername = (String) savedInstanceState.getSerializable("Username"); 
    mPassword = (String) savedInstanceState.getSerializable("Password"); 
    mUserID = (String) savedInstanceState.getSerializable("UserID"); 
} 

allora si può essere sicuri gli oggetti non sono nulli.

Problemi correlati