5

Devo applicare diversi layout per gli orientamenti verticali e orizzontali della mia attività. Inoltre, ho bisogno di mostrare un avviso se l'orientamento è verticale.Gestione attività in rotazione su Android

Ho specificato android:configChanges="orientation|keyboardHidden" in AndroidManifest. Ho anche l'override metodo onConfigurationChanged come questo:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

Mentre rotazione dal paesaggio al registro ritratto assomiglia:

config changed 
Portrait 

Ma mentre si passa da verticale a orizzontale Sembra

config changed 
Portrait 
config changed 
Landscape 

Perché onConfigurationChanged viene chiamato due volte? Come posso evitarlo?

risposta

3

Vedere la mia risposta ad un'altra domanda qui: https://stackoverflow.com/a/3252547/338479

In breve, la gestione modifiche di configurazione in modo corretto è difficile da fare. È meglio implementare onRetainNonConfigurationInstance() che viene richiamato appena prima che l'applicazione venga arrestata e riavviata a causa di una modifica della configurazione. Usa questo metodo per salvare tutto ciò che vuoi ('questo' è una buona scelta) e poi lasciare che il sistema abbatta la tua app.

Quando l'app viene riavviata con la nuova configurazione, utilizzare getLastNonConfigurationInstance() per recuperare lo stato appena salvato e utilizzarlo per continuare l'applicazione senza troppi problemi con i pacchetti e le preferenze condivise.

0

C'è qualche ragione particolare per cui hai scelto di gestire la rotazione in questo modo? Mentre è più veloce poiché l'attività non viene riavviata con un cambio di orientamento, non è in genere consigliabile, se ricordo correttamente. Un altro modo per gestire i cambiamenti di orientamento è invece prioritario , ignorando onCreate(), onStart() o onResume() tale che

@Override 
public void onStart() { 
    super.onStart(); 
    int orientation = getWindowManager().getDefaultDisplay().getOrientation(); 
    if(orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Log.i(TAG, "Orientation is portrait"); 
     // show whatever alerts here 
    } 
} 

e specificando due layout - uno per ritratto, uno per il paesaggio. La versione verticale del layout rimarrebbe a res/layout/whatever.xml e la versione orizzontale verrebbe pubblicata in res/layout-land/whatever.xml. Gli AndroidGuys hanno scritto un sacco di buoni articoli su questo argomento, vedere http://androidguys.com/?s=rotational+forces&x=9&y=9

+0

Perché onConfigurationChanged() non è valido? Potresti darmi un collegamento con una spiegazione? Se userò onCreate() o qualcosa del genere, l'attività verrà ricreata e i suoi dati andranno persi. – darja

0

Sono quasi sicuro che vorresti usare onCreate piuttosto che onStart. L'unica differenza sembra essere che onStart verrà chiamato quando l'applicazione arriva in primo piano. Non sarebbe il caso in cui vorresti che l'utente attenda di reinizializzare l'interfaccia utente. In caso contrario, modifica la chiamata setContentView in base a tale condizione.

+0

Sono d'accordo con te, il metodo onCreate viene richiamato quando l'orientamento del dispositivo cambia –

+0

Perché è meglio allora onConfigurationChanged? – darja

+0

Credo che finirai per costruire l'interfaccia utente due volte in quel caso. Sia onConfigurationChange che onCreate verranno richiamati quando lo schermo ruota. Devi già configurare l'interfaccia utente in onCreate per tutte le altre situazioni di creazione. – JOTN

0

Android avvia una nuova istanza dell'attività quando si cambia orientamento, quindi utilizzare onCreate è il metodo ideale. Dovrai salvare/ripristinare i dati della tua attività ovviamente per riprendere da dove avevi interrotto, ma dovresti farlo comunque, dal momento che qualsiasi numero di eventi può sfociare/uccidere la tua applicazione.

+0

Perché i downvotes? Ha ragione. –

1

È possibile salvare semplicemente l'orientamento precedente e verificare se è realmente cambiato.

Se si imposta in AndroidManifest.xmlandroid:configChanges a keyboardHidden|orientation per la propria attività, onCreate ecc. Non verrà chiamato. Ciò rende l'implementazione molto più semplice da implementare. Ma naturalmente il layout cambierà da verticale a orizzontale.

Problemi correlati