2015-06-01 14 views
6

Dies ist so ziemlich ein klassischer Android-Anwendungsfall.Android Orientierungsänderung: Anderes Layout, Gleiche Fragmente

Angenommen, wir haben 2 Fragmente: FragmentA und FragmentB.

Im Querformat-Modus sitzen FragmentA und FragmentB nebeneinander.

Im Hochformat nehmen sie bei der Verwendung jeweils den gesamten Bildschirm ein.

(das Bild sehen, aber ersetzen Tabletten-> Landschaft und handset-> Porträt) Different Layout, Same Fragments on Orientation Change

Wie hier erklärt (Supporting Single-Pane and Multi-Pane Layouts), gibt es zwei Möglichkeiten, dies zu erreichen:

1- Multiple Fragmente, eine Aktivität: Verwenden Sie unabhängig von der Gerätegröße eine Aktivität, entscheiden Sie jedoch zur Laufzeit, ob Sie Fragmente im Layout kombinieren (um ein Multiple-Panel-Design zu erstellen) oder Fragmente austauschen (um ein Single-Panel-Design zu erstellen).

2- Mehrere Fragmente, mehrere Aktivitäten: Auf einer Tablette mehrere Fragmente in einer Aktivität platzieren; Verwenden Sie auf einem Mobiltelefon separate Aktivitäten, um jedes Fragment zu hosten. Wenn das Tablettdesign beispielsweise zwei Fragmente in einer Aktivität verwendet, verwenden Sie die gleiche Aktivität für Handgeräte, aber stellen Sie ein alternatives Layout bereit, das nur das erste Fragment enthält. Wenn Sie auf einem Mobilteil arbeiten und Fragmente wechseln müssen (z. B. wenn der Benutzer ein Element auswählt), starten Sie eine andere Aktivität, die das zweite Fragment hostet.

Dieses sehr viel Sinn in der Theorie macht, aber ich habe einige Hürden bei dem Versuch, schlagen in einer Art und Weise entweder dieser Ansätze tatsächlich umzusetzen, dass den Zustand der Fragmente wieder her, wenn die Orientierungsänderungen und Zurück-Taste Presse.

Ich versuchte den ersten Ansatz und kam ziemlich weit, fand es aber chaotisch, weil es die manuelle Verwaltung aller Fragmenttransaktionen erforderte, insbesondere weil der Container eines Fragments nicht leicht geändert werden kann. Es ist auch ein Schmerz, zu entscheiden, was bei einem gedrückten Rücken zu tun ist, da die letzte Transaktion auf dem Backstack zu der anderen Orientierung gehören könnte.

Jetzt versuche ich die zweite Option. Es scheint bisher sauberer zu sein, aber die Fragmente werden bei jeder Orientierungsänderung von Grund auf neu erstellt (weil jede Orientierung eine andere Aktivität verwendet). Ich möchte eine Möglichkeit haben, den Fragmentstatus von der anderen Aktivität/Ausrichtung wiederherzustellen.

Kann jemand erklären, wie dies getan werden kann, oder zeigen Sie mich zu einem geeigneten Tutorial oder Beispielanwendung?

+1

Allgemeinen von einem zwei Scheibe zu Einscheibensicherheitsglas Ansatz auf dem gleichen Gerät wird nicht empfohlen Schalt (mentale Modelle von dem, was passieren soll, wenn von zwei Scheibe zu einem gehen unterscheiden und Verwirrung verursachen kann). Das ist einer der Gründe, warum Sie dieses Muster nicht oft sehen und stattdessen feinkörnigere Layoutänderungen sehen, die einen einzelnen Bereich für Querformat oder zwei Bereiche für Hochformat anpassen. – ianhanniballake

+0

Ich habe nicht verstanden, was Sie mit "Ich möchte einen Weg haben, um den Fragment-Status von der anderen Aktivität/Orientierung wiederherzustellen." Worauf bezieht sich andere Aktivität? – Dinash

Antwort

4
  • diese Konfiguration in MainActivity hinzufügen wo Fragment ersetzen sind <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
  • Sie haben Fragment Landschaft Layout für fragmenta und FragmentB enter image description here
  • , wenn Sie das Verhalten von sowohl Fragment ändern müssen erstellen Sie sollten in onConfigurationChanged Ereignis des Fragments ändern.

@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 } }

Verwandte Themen