Ich schreibe eine App für 4.0- und 4.1-Tablets, für die ich nicht die Support-Bibliotheken (falls nicht benötigt) verwenden möchte, sondern nur deshalb die 4.x-API.
Meine Zielplattform ist also sehr gut definiert als:> = 4.0 und <= 4.1
Die App verfügt über ein Layout mit mehreren Fenstern (zwei Fragmente, eines links, ein Inhaltsfragment rechts) und eine Aktionsleiste mit Registerkarten.
Ähnlich wie dies:
Durch Klicken auf eine Registerkarte in der Aktionsleiste wird das äußere Fragment geändert, und das innere Fragment ist dann ein Fragment mit zwei verschachtelten Fragmenten (1. kleines Fragment der linken Liste, 2. Fragment mit breitem Inhalt).
Ich frage mich jetzt, was die beste Vorgehensweise ist, um Fragmente und insbesondere verschachtelte Fragmente zu ersetzen. Der ViewPager ist Teil der Support-Bibliothek. Für diese Klasse gibt es keine native 4.x-Alternative. Scheint in meinem Sinne "veraltet" zu sein. - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Dann habe ich die Versionshinweise für Android 4.2 gelesen ChildFragmentManager
, was gut passt, aber ich ziele auf 4.0 und 4.1 ab, daher kann dies auch nicht verwendet werden.
ChildFragmentManager
ist nur in 4.2 verfügbar
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
Leider gibt es kaum gute Beispiele, die Best Practices für die Verwendung von Fragmenten ohne die Support-Bibliothek zeigen, selbst in den gesamten Android-Entwicklerhandbüchern. und vor allem nichts in Bezug auf verschachtelte Fragmente.
Ich frage mich also: Ist es einfach nicht möglich, 4.1-Apps mit verschachtelten Fragmenten zu schreiben, ohne die Support-Bibliothek und alles, was dazu gehört, zu verwenden? (Müssen Sie FragmentActivity anstelle von Fragment usw. verwenden?) Oder was wäre die beste Vorgehensweise?
Das Problem, das ich derzeit in der Entwicklung habe, ist genau diese Aussage:
Die Android Support Library unterstützt jetzt auch verschachtelte Fragmente, sodass Sie verschachtelte Fragmentdesigns unter Android 1.6 und höher implementieren können.
Hinweis: Sie können ein Layout nicht in ein Fragment aufblasen, wenn dieses Layout a enthält
<fragment>
. Verschachtelte Fragmente werden nur unterstützt, wenn sie dynamisch zu einem Fragment hinzugefügt werden.
Weil ich die verschachtelten Fragmente in XML definiere, was anscheinend einen Fehler verursacht wie:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
Im Moment schließe ich für mich selbst: Selbst in 4.1, wenn ich nicht einmal auf die 2.x-Plattform abzielen möchte, sind verschachtelte Fragmente, wie im Screenshot gezeigt, ohne die Support-Bibliothek nicht möglich.
(Dies ist vielleicht eher ein Wiki-Eintrag als eine Frage, aber vielleicht hat es schon jemand anderes geschafft).
Aktualisieren:
Eine hilfreiche Antwort finden Sie unter: Fragment Inside Fragment
quelle
ActionBar
(von Samsung selbst erstellten) App stehen könnten . Schauen Sie sich ActionBarSherlock genauer an. Es enthält die Registerkarten in der ActionBar, wenn Platz vorhanden ist.Antworten:
Einschränkungen
Das Verschachteln von Fragmenten in einem anderen Fragment ist mit xml daher nicht möglich, unabhängig davon, welche Version
FragmentManager
Sie verwenden.Sie müssen also Fragmente per Code hinzufügen, dies scheint ein Problem zu sein, macht Ihre Layouts aber auf lange Sicht superflexibel.
Also nisten ohne zu benutzen
getChildFragmentManger
? Das Wesentliche dahinterchildFragmentManager
ist, dass das Laden verschoben wird, bis die vorherige Fragmenttransaktion abgeschlossen ist. Und natürlich wurde es natürlich nur in 4.2 oder der Support-Bibliothek unterstützt.Verschachteln ohne ChildManager - Lösung
Lösung, sicher! Ich mache das schon lange (seit dem
ViewPager
angekündigt wurde).Siehe unten; Dies ist eine
Fragment
Option, die das Laden verzögert, sodassFragment
s darin geladen werden kann.Es ist ziemlich einfach, das
Handler
ist eine wirklich sehr praktische Klasse. Der Handler wartet effektiv darauf, dass ein Leerzeichen im Hauptthread ausgeführt wird, nachdem die aktuelle Fragmenttransaktion festgeschrieben wurde (da Fragmente die Benutzeroberfläche stören, die sie im Hauptthread ausführen).Ich würde es nicht als "Best Practice" betrachten, aber ich habe Live-Apps, die diesen Hack verwenden, und ich habe noch keine Probleme damit.
Ich verwende diese Methode auch zum Einbetten von Ansichtspagern - https://gist.github.com/chrisjenx/3405429
quelle
fragment
Element stoßen, überschreiben Sie die Super-Implementierung und versuchen, sie selbst zu analysieren / aufzublasen. Aber das wird eine Menge Aufwand sein, weit außerhalb des Rahmens einer StackOverflow-Frage.Der beste Weg, dies in Pre-API 17 zu tun, besteht darin, es überhaupt nicht zu tun. Der Versuch, dieses Verhalten zu implementieren, führt zu Problemen. Dies bedeutet jedoch nicht, dass es mit der aktuellen API 14 nicht überzeugend gefälscht werden kann. Was ich getan habe, war Folgendes:
1 - Sehen Sie sich die Kommunikation zwischen Fragmenten an http://developer.android.com/training/basics/fragments/communicating.html
2 - Verschieben Sie Ihr Layout-XML-FrameLayout von Ihrem vorhandenen Fragment in das Aktivitätslayout und blenden Sie es aus, indem Sie eine Höhe von 0 angeben:
3 - Implementieren Sie die Schnittstelle im übergeordneten Fragment
4 - Implementieren Sie die Schnittstelle in der übergeordneten Aktivität
öffentliche Klasse YourActivity erweitert Activity implementiert yourParentFragment.OnListener {
}}
5 - Genießen Sie, mit dieser Methode erhalten Sie die gleiche flüssige Funktionalität wie mit der Funktion getChildFragmentManager () in einer Umgebung vor API 17. Wie Sie vielleicht bemerkt haben, ist das untergeordnete Fragment nicht mehr wirklich ein Kind des übergeordneten Fragments, sondern jetzt ein Kind der Aktivität. Dies kann wirklich nicht vermieden werden.
quelle
Ich musste mich genau mit diesem Problem befassen, da NavigationDrawer, TabHost und ViewPager kombiniert wurden und aufgrund von TabHost Probleme bei der Verwendung der Support-Bibliothek auftraten. Und dann musste ich auch die min-API von JellyBean 4.1 unterstützen, sodass die Verwendung verschachtelter Fragmente mit getChildFragmentManager keine Option war.
So kann mein Problem destilliert werden, um ...
Meine Lösung bestand darin, die Illusion verschachtelter Fragmente zu erzeugen, ohne tatsächlich Fragmente zu verschachteln. Ich habe dies getan, indem die Hauptaktivität TabHost AND ViewPager verwendet hat, um zwei Geschwisteransichten zu verwalten, deren Sichtbarkeit durch Umschalten von layout_weight zwischen 0 und 1 verwaltet wird.
Dies ermöglichte es meinem gefälschten "verschachtelten Fragment" effektiv, als unabhängige Ansicht zu arbeiten, solange ich die relevanten Layoutgewichte manuell verwaltete.
Hier ist meine activity_main.xml:
Beachten Sie, dass "@ + id / pager" und "@ + id / container" Geschwister mit 'android: layout_weight = "0.5"' und 'android: layout_height = "0dp"' sind. Dies ist so, dass ich es in der Vorschau für jede Bildschirmgröße sehen kann. Ihre Gewichte werden ohnehin zur Laufzeit im Code bearbeitet.
quelle
SO
dass die Verwendung vonActionBar
Registerkarten mit einemNavigation Drawer
nicht gut ist, da die Registerkarten automatisch über der Ansicht Ihrer Schublade platziert werden. Entschuldigung, ich habe keinen Link, um dies zu sichern.Aufbauend auf der Antwort von @ Chris.Jenkins ist dies die Lösung, die für mich gut funktioniert hat, um Fragmente während Lebenszyklusereignissen zu entfernen (die dazu neigen, IllegalStateExceptions auszulösen). Dies verwendet eine Kombination aus dem Handler-Ansatz und einer Activity.isFinishing () -Prüfung (andernfalls wird ein Fehler für "Kann diese Aktion nach onSaveInstanceState nicht ausführen) ausgegeben.
Verwendung:
quelle
Obwohl das OP besondere Umstände hat, die ihn daran hindern, die Support-Bibliothek zu verwenden, sollten die meisten Benutzer sie verwenden. In der Android-Dokumentation wird dies empfohlen, und Ihre App wird einem möglichst breiten Publikum zugänglich gemacht.
In meiner ausführlicheren Antwort hier habe ich ein Beispiel gemacht, das zeigt, wie verschachtelte Fragmente mit der Unterstützungsbibliothek verwendet werden.
quelle