2015-06-01 15 views
6

Questo è praticamente un classico caso di utilizzo Android.Modifica dell'orientamento Android: layout diverso, stessi frammenti

Diciamo che abbiamo 2 frammenti: FragmentA e FragmentB.

In modalità orizzontale, FragmentA e FragmentB sono affiancati.

In modalità verticale, entrambi occupano tutto lo schermo quando è in uso.

(Vedere questa immagine, ma sostituire tablet-> paesaggio e handset-> ritratto) Different Layout, Same Fragments on Orientation Change

Come spiegato qui (Supporting Single-Pane and Multi-Pane Layouts), ci sono 2 modi per raggiungere questo:

1- multipla frammenti, un'attività: utilizzare un'attività indipendentemente dalla dimensione del dispositivo, ma decidere in fase di esecuzione se combinare i frammenti nel layout (per creare un disegno a più riquadri) o scambiare i frammenti (per creare un disegno a riquadro singolo).

2- Frammenti multipli, attività multiple: su una tavoletta, posizionare più frammenti in un'unica attività; su un portatile, utilizzare attività separate per ospitare ciascun frammento. Ad esempio, quando il design della tavoletta utilizza due frammenti in un'attività, utilizzare la stessa attività per i portatili, ma fornire un layout alternativo che include solo il primo frammento. Quando si esegue su un telefono e occorre cambiare i frammenti (ad esempio quando l'utente seleziona un elemento), avviare un'altra attività che ospita il secondo frammento.

Questo rende molto senso, in teoria, ma sto colpendo alcuni ostacoli nel tentativo di applicare concretamente uno di questi approcci in un modo che ripristina lo stato dei Frammenti quando cambia l'orientamento e il pulsante Indietro premere.

Ho provato il primo approccio e sono arrivato abbastanza lontano, ma l'ho trovato disordinato perché richiedeva la gestione manuale di tutte le transazioni dei frammenti, in particolare perché il contenitore di un frammento non può essere modificato facilmente. È anche difficile decidere cosa fare in back press perché l'ultima transazione sul backstack potrebbe appartenere all'altro orientamento.

Ora sto provando la seconda opzione. Sembra più pulito finora ma i Frammenti vengono ricreati da zero ad ogni cambio di orientamento (poiché ogni orientamento utilizza un'attività diversa). Mi piacerebbe avere un modo per ripristinare lo stato Fragment dall'altra attività/orientamento.

Qualcuno può spiegare come questo può essere fatto, o indicarmi un tutorial appropriato o un'applicazione di esempio?

+1

Generalmente, il passaggio da un riquadro per due unico approccio riquadro sullo stesso dispositivo non è raccomandato (modelli mentali di ciò che dovrebbe accadere quando si passa da due a uno riquadro differiscono e possono causare confusione). Questo è uno dei motivi per cui non si vede questo schema molto spesso e invece si vedono più cambi di layout a grana fine che adattano un singolo riquadro per orizzontale o due per verticale. – ianhanniballake

+0

Non ho capito cosa intendi con "Mi piacerebbe avere un modo per ripristinare lo stato Fragment dall'altra attività/orientamento". A quale altra attività si riferisce? – Dinash

risposta

4
  • aggiungere questa configurazione in MainActivity dove Frammento sono sostituire <activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboard|keyboardHidden" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT"/></intent-filter> </activity
  • Bisogna creare frammento di layout orizzontale per fragmenta e FragmentB enter image description here
  • se avete bisogno di cambiare il comportamento di entrambi frammento si dovrebbe cambiare in onConfigurationChanged evento di frammento.

@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { //write your stuff for landscape orientation }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { //write your stuff for portrait orientation } }

Problemi correlati