6

Ho una piccola attività con un EditText e una visualizzazione di immagini e un pulsante. Quando si preme il pulsante, avvia la fotocamera per il risultato, e quando viene restituito cambia la visualizzazione di immagini all'immagine appena scattata.Le mie visualizzazioni vengono ripristinate sul cambio di orientamento

Ma quando l'orientamento cambia, la vista immagine si reimposta su quella predefinita sul layout.

Quello che ho provato a fare era impostare un booleano chiamato personalizzato, e quando si scatta una foto la imposta su true. Overrid onConfigurationChanged() e se custom è impostato su true, ripristino l'immagine.

Il mio problema ora è che EditText viene cancellato - Come posso ripristinare EditText dopo la modifica della configurazione? Il mio primo tentativo è stato archiviarlo in un String onPause() e poi ripristinarlo, ma è sempre vuoto.

risposta

14

Generalmente, quando la vista dell'interfaccia utente non mantiene il suo stato, la prima cosa da verificare è che questa vista dell'interfaccia utente ha un ID assegnato. Senza questa view ID non è possibile ripristinare il loro stato.

<EditText android:id="@+id/text" ... /> 

Se questo non risolve il problema, è necessario salvare e ripristinare lo stato te stesso. Dai un'occhiata a Handling Runtime Changes. Spiega più o meno quello che si dovrebbe fare:

Per gestire correttamente un riavvio, è importante che la vostra attività ripristina lo stato precedente attraverso il normale ciclo di vita di attività, in cui Android chiama onSaveInstanceState() prima che distrugge la vostra attività in modo da può salvare dati sullo stato dell'applicazione. È quindi possibile ripristinare lo stato durante onCreate() o onRestoreInstanceState(). Per verificare che l'applicazione si riavvii con lo stato dell'applicazione intatto, è necessario richiamare le modifiche alla configurazione (come la modifica dell'orientamento dello schermo) durante l'esecuzione di varie attività nell'applicazione.

Si dovrebbe ignorare onSaveInstanceState() e salvare il vostro stato acitivity quando la sua chiamata:

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putString("textKey", mEditText.getText().toString()); 
} 

E poi ripristinare lo stato in onCreate() o onRestoreInstanceState():

public void onCreate(Bundle savedInstanceState) 
{ 
    if(savedInstanceState != null) 
    { 
     mEditText.setText(savedInstanceState.getString("textKey")); 
    } 
} 

Se questo non è ancora sufficiente, è possibile ignorare onRetainNonConfigurationInstance() e restituire qualsiasi oggetto personalizzato che sarà pa ssed al nuovo oggetto activity, quando è ricreato. Maggiori dettagli su come usarlo possono essere trovati in Handling Runtime Changes. Ma questa funzione è deprecata in Android 3.0+ (in particolare per FragmentActivity dove è il suo finale). Quindi questo non può essere usato insieme a Fragments (che va bene, hanno il loro meccanismo per conservare gli oggetti attraverso le modifiche alla configurazione).


E uno finale: non utilizzare mai android:configChanges. Devi avere ottime ragioni per usarlo, e solitamente questi sono i motivi di prestazione. Non è stato pensato per essere abusato come è ora: solo per prevenire il reset dello stato dell'interfaccia utente. Se si utilizza questo attributo, allora sì, l'interfaccia utente di Attività non verrà reimpostata sul cambiamento di configurazione, ma lo stato di attività verrà comunque ripristinato una volta distrutto e ricreato in seguito.

La documentazione spiega questa opzione abbastanza bene:

Nota: la gestione della configurazione di cambiare voi stessi può rendere molto più difficile da usare risorse alternative, in quanto il sistema non li applica automaticamente per voi. Questa tecnica dovrebbe essere considerata ultima risorsa e non è raccomandato per maggior parte delle applicazioni

+0

Ok, sembra un approccio migliore. Posso usare questo per la bitmap, e quindi l'edittext non sarà un problema - Ma quale funzione dovrei usare per salvare lo stato dell'immagine? – Sebastian

+0

Se la bitmap viene salvata su disco, basta salvare il percorso in bitmap nella funzione 'onSaveInstanceState()'. Se la bitmap è in memoria, puoi usare 'onRetainNonConfigurationInstance()'. – inazaruk

4

È possibile forzare la propria attività a non ricaricare dopo l'orientamento modificato aggiungendo android:configChanges="orientation" alla riga di attività in manifest.

+0

Ma non sarebbe che rendono l'attività non regolare al telefono di essere di traverso? – Sebastian

+0

Questa è la risposta corretta. Quello che impedisce allo schermo di cambiare l'orientamento è 'android: screenOrientation =" portrait "' –

+4

Mentre questo risolve questo caso particolare, non risolve il problema sottostante. E 'Android: configChanges' è considerato l'ultima risorsa e normalmente non dovrebbe mai essere usato. http://developer.android.com/guide/topics/resources/runtime-changes.html – inazaruk

Problemi correlati