@kris larson, Ich akzeptiere Ihre Antwort, um Sie für all Ihre harte Arbeit und detaillierte Erklärungen zu belohnen! Da ich vorwärts pflog und versuchte, etwas selbst herauszufinden, dachte ich, ich würde etwas von dem, was ich versucht hatte, teilen, damit andere von meinen Kopfschmerzen profitieren können. Ich werde sicherlich nicht sagen, das ist der beste Weg!
Ich habe zwei Fragment-Layout-Dateien erstellt. Eines enthielt ein FrameLayout mit der ID fragment_container_master und ein FrameLayout mit der ID fragment_container_detail. Der andere hatte gerade das fragment_container_detail FrameLayout. Ich habe die Doppelscheibe in layout-w720dp und die Einzelscheibe im Layout.
Ich werde feststellen, dass Android Docs es klingen wie die -sw ("kleinste Breite") Modifikator ist vorzuziehen, -w ("Breite").-sw nimmt das kleinere, die Breite oder die Höhe an. Ich fand das nicht relevant für diesen Anwendungsfall: Auf einem großen Bildschirm wollte ich zwei Scheiben, so einfach. Aber vielleicht gibt es einen guten Grund, um -sw zu benutzen.
Mit FragmentTransactions würde ich die Liste der Fragmente zu fragment_container_master und das Standarddetail Fragment zu fragment_container_detail hinzufügen. Wenn der Benutzer auf ein anderes Fragment in der Liste klickte, würde ich das Fragment in fragment_container_detail ersetzen. Leicht genug.
Ich würde die Anwesenheit oder Abwesenheit von fragment_container_master verwenden, um zu wissen, ob ich im Einscheiben- oder Doppelscheiben-Modus arbeitete. Wenn es sich um ein einzelnes Fenster handelt, stelle ich sicher, dass Fragmentübergänge zum Backstack hinzugefügt werden, und stelle sicher, dass die Fragmentliste zunächst in fragment_container_detail geladen wird.
Wie ich bereits erwähnt habe, ist der Wechsel zwischen Single- und Double-Panel (wie beim Drehen eines 7 "-Tabletts) der knifflige Teil. Ich musste die App-Leiste aktualisieren, um zu verhindern, dass Buttons zweimal hinzugefügt werden.
Zuerst I benötigt, um festzustellen, ob I zwischen diesen beiden Modi wurde schaltet. I durch 1, dass in onCreate tun könnte) Erfassen, ob I in Einscheibensicherheitsglas oder Doppelscheiben-Modus 2) detektieren aM Betrieb ob es eine ist Fragment, das mit einer ID von fragment_container_master schwebt Wenn ich im Single-Panel-Modus bin und ein Master-Fragment vorhanden ist, muss es aus dem Doppel-Fenster-Modus übrig bleiben. Wenn ich im Doppel-Fenster-Modus bin, und nicht ein Meister Fragment, es muss nicht initialisiert worden sein, weil ich gerade vom Single-Panel-Modus wechselte.
Wenn ich gerade in den Doppel-Fenster-Modus wechselte, muss ich das Master-Fragment in fragment_container_master laden. Wenn das Detailfragment die Liste Fragment ist, entferne ich es und füge es zu fragment_container_master hinzu. Wenn nicht, zeigten wir bereits ein Detailfragment. Man könnte meinen, ich könnte es einfach dort lassen ... aber da ist das Problem mit dem Backstack. Ich speichere also den Fragmentstatus, platziere ihn und erzeuge ihn mit dem gespeicherten Zustand neu. Dann habe ich eine Double-Panel-Benutzeroberfläche mit nichts auf dem Back-Stack, wie ich will.
Wenn ich gerade in den Single-Panel-Modus gewechselt bin, muss ich entscheiden, was in der Detailansicht angezeigt werden soll. Wenn das Fragment mit der ID fragment_container_detail das Standardfragment ist, kann ich dort die Liste Fragment anzeigen (die vorhandene ersetzen). Wenn es nicht das Standardfragment ist, dann ersetze ich es immer noch mit der Liste Fragment, aber ersetze dann die Liste Fragment durch das Detailfragment, das vorher dort war - stell sicher, dass es zum Backstack hinzugefügt wird.
Klingt ziemlich komplex, oder?
Es wird schlimmer.
Angenommen, der Benutzer ruft den Bildschirm im Doppelfenstermodus auf. Der Benutzer interagiert mit dem Standarddetailfragment, scrollt es möglicherweise oder gibt Daten in ein Feld ein. Dann wird der Bildschirm in den Einzelbildschirmmodus geändert. Der Benutzer möchte offensichtlich das Detailfragment sehen, in dem sie gearbeitet haben. Angenommen, der Benutzer öffnet den Bildschirm und wechselt dann, bevor er etwas anderes tut, in den Einzelflächenmodus. Sie möchten das Standarddetailfragment nicht sehen. Sie wollen das Master-Fragment sehen, das alle anderen Fragmente auflistet. Sie wären ziemlich verwirrt, wenn sie bereits einen Weg gegangen wären, den sie nicht gewählt hatten. Probieren Sie die Google Mail-App aus und Sie werden sehen, wie es genau so funktioniert. Wechseln Sie im Doppelfenstermodus in den Einzelbildschirmmodus (drehen Sie das Tablet) und Sie sehen Ihren Posteingang. Wenn Sie jedoch im Doppel-Fenster-Modus die erste E-Mail scrollen oder mit ihr interagieren und dann in den Single-Panel-Modus wechseln, wird diese E-Mail angezeigt. Ich konnte keinen klugen, einfachen Weg finden, dies zu tun.Es ist mir peinlich, das zu sagen, aber ich hatte gerade eine Menge anderer Zuhörer im Standardfragmentbericht zur Aktivität, als das Fragment interagiert wurde. Also musste ich für jede spezifische Situation kodieren: Wenn der Benutzer auf diese Schaltfläche klickt oder diese ListView berührt oder diese andere Sache tut, dann melde, dass der Benutzer mit diesem Fragment interagiert hat.
Ich entschuldige mich dafür, nicht ins Detail gegangen zu sein oder Code-Beispiele zu erstellen, wollte einfach nur aus dem Kopf für zukünftige Referenz, bevor ich es vergesse.
Danke für die ausführliche Antwort! –
Ich weiß, dass dies nur für Beispielzwecke ist, aber für die Erbauung dieses Lesens werde ich bemerken: Es ist besser, einen Layout-Ressourcenmodifizierer basierend auf der Größe, wie Layout-w720dp, als Layout-Landschaft zu verwenden. Auf diese Weise werden zwei Fenster auf großen Bildschirmen angezeigt, auch wenn es sich um ein sehr großes Gerät im Hochformat oder um ein Desktop-Fenster handelt. –
Guter Punkt. Meine App verfügt über einen blutigen Code, um zu verhindern, dass Geräte mit kleinen Bildschirmen, z. B. Telefone, in den Querformat-Modus wechseln, mit Ausnahme einer bestimmten Benutzeroberfläche. Schätze, deshalb kam mir das nicht in den Sinn. –