Was ich will.
In einem Tab-Sliding-Menükontext möchte ich ein Fragment in einem Tab ersetzen und das Tab-Menü sowie das aktuelle Tab beibehalten. Wenn ich zu einer anderen Registerkarte wechsle und zum Original zurückkehre, möchte ich, dass das letzte Fragment angezeigt wird.
Ich habe zum Beispiel tab_a
mit Fragment_1
, tab_b
mit Fragment_4
und tab_c
mit Fragment_7
. Jetzt möchte ich eine Schaltfläche in Fragment_1
, die mich Fragment_2
öffnet, aber ich möchte in der Lage sein, zu den Fragmenten von tab_b
und tab_c
zu wischen. Und wenn ich zu Tab_a zurückkehre, muss Fragment_2
angezeigt werden.
Meine aktuelle Haupttätigkeit.
Xml
%Vor%Code
%Vor%Fragmente
Xml
%Vor%Code
%Vor%Bearbeiten:
Ich habe einige Lösungen, aber keine ist perfekt. Wenn ich ein Frollelayout in MainActivity anlege, wird Fragment_1
korrekt in Fragment_2
ersetzt, aber auch in tab_b
und tab_c
. Wenn das FrameLayout in Fragment_1
ist, kann ich die anderen Tabs richtig streichen, aber die Ersetzung geht nicht gut, weil Fragment_2
geöffnet ist, aber auch Fragment_1
ist da.
Sie können ViewPager
zusammen mit TabLayout
verwenden.
Erstellen Sie dann eine Klasse, die FragmentStatePagerAdapter
erweitert, um ViewPager
mit Ihrer anfänglichen Fragment
s zu initialisieren:
Die Fragmente, die den tatsächlichen Inhalt enthalten, sollten von einem HostFragment
umschlossen werden, das sein Kind FragmentManager
verwendet, um das aktuelle Fragment durch ein neues zu ersetzen, oder um das letzte Fragment aus dem Fragmentstapel zu entfernen . Rufen Sie replaceFragment
zum Navigieren auf:
Das HostFragment sollte die abstrakte Klasse BackstackFragment
Verdrahte alles in MainActivity
:
Diese Lösung ist sicherlich nicht perfekt, aber erledigt die Arbeit. Lesen Sie mehr darüber in meinem Blogpost zum Thema.
Basierend auf dem, was Sie erklärt haben, implementiere ich Folgendes:
1- Erstellen Sie in Ihrer Aktivität Tabs
und ViewPager
:
2- Erstellen Sie in jedem Tab ViewPager
(Ich nehme an, Sie wollen Tabs innerhalb von tabs
, wenn Sie keine Tabs brauchen, entfernen Sie sie einfach). Die Implementierung jedes fragment
wäre etwa wie folgt:
Auch im Fragment erstellen Sie einen Button, der beim Klicken auf ein anderes Fragment geht:
%Vor% Endergebnis wäre etwas wie folgt und wenn Sie zu Startseite Tabs gehen und dann zurück zu Kategorie Tab gehen, werden Sie Ihre Fragment
Position nicht geändert.
Zwei Punkte, an die Sie sich erinnern sollten:
mPager.setOffscreenPageLimit(3);
, wenn du dein Fragment nicht zerstören willst getChildFragmentManager()
anstelle von FragmentManager()
Wenn Sie Inner ViewPager
nicht benötigen Und Sie wollen nur eine Instanz von Fragment zur Zeit hier laden, ist eine weitere Option:
1- Machen Sie den ersten Punkt des vorherigen Weges.
2- Setzen Sie in Ihrem Fragment xml FrameContainer und laden Sie Ihr Fragment darin:
%Vor%Bearbeiten: Dies ist nicht der beste Ansatz, aber ich denke, dein Problem zu lösen:
1- Erstellen Sie ein statisches Feld in Ihrem MainActivity
wie folgt:
2- Wenn Sie onClick in Ihrem Fragment aufrufen, aktualisieren Sie String
value in Ihrem MainActivity
.
erster Wert ist ViewPager-Position, zweiter Wert ist Ihr innerer Fragmenttyp (z. B. fragment_d);
3- In Ihrem ViewPager
%Vor%Sie können Fragmente innerhalb des Seitenfragments ändern. TAB_A implementiert beispielsweise eine Logik zum Auswählen des Fragments 1 oder 2 und zum Anzeigen des ausgewählten Fragments darin. Hierarchie sieht wie folgt aus:
ViewPager - & gt; TAB_A - & gt; Fragment 1 oder 2 (Anzeige innerhalb von TAB_A).
Sie sollten getChildFragmentManager () auch verwenden, um Fragmente in TAB_A zu verwalten.
Tags und Links java android android-fragments android-viewpager android-tablayout