Ich versuche, die neue Navigationskomponente zu verwenden. Ich verwende eine BottomNavigationView mit dem navController: NavigationUI.setupWithNavController (bottomNavigation, navController)
Aber wenn ich Fragmente wechsle, werden sie jedes Mal zerstört / erstellt, selbst wenn sie zuvor verwendet wurden.
Gibt es eine Möglichkeit, unseren Hauptfragment-Link zu unserer BottomNavigationView am Leben zu erhalten?
android
navigation
bottomnavigationview
IdAndro
quelle
quelle
Antworten:
Versuche dies.
Navigator
Erstellen Sie einen benutzerdefinierten Navigator.
NavHostFragment
Erstellen Sie ein benutzerdefiniertes NavHostFragment.
navigation.xml
Verwenden Sie ein benutzerdefiniertes Tag anstelle eines Fragment-Tags.
Aktivitätslayout
Verwenden Sie CustomNavHostFragment anstelle von NavHostFragment.
Aktualisieren
Ich habe ein Beispielprojekt erstellt. Verknüpfung
Ich erstelle kein benutzerdefiniertes NavHostFragment. Ich benutze
navController.navigatorProvider += navigator
.quelle
fragments
wiederverwendet, nicht neu erstellt), gibt es ein Problem mit der Navigation. Jedesmenuitem
Inbottomnavigationview
wird als primär betrachtet. Wenn SieBACK
also drücken, wird die App beendet (oder geht zur obersten Komponente). Eine bessere Lösung wäre, sich wie die YouTube-App zu verhalten: (1) Tippen Sie auf Startseite. (2) Tippen Sie auf Trend; (3) Tippen Sie auf Posteingang. (4) Tippen Sie auf Trend; (5) TippenBACK
- geht zum Posteingang; (6) TippenBACK
- geht nach Hause; (7) TapBACK
- App existiert. Zusammenfassend lässt sich sagen, dass die YouTube-BACK
Funktionalität zwischen "menuitems
" auf die neueste zurückgesetzt wird, ohne dass Elemente wiederholt werden.app:navGraph
das NavHostFragment Ihrer Aktivität zu entfernen.Google-Beispiellink Kopieren Sie einfach NavigationExtensions in Ihre Anwendung und konfigurieren Sie sie anhand eines Beispiels. Funktioniert super.
quelle
Nach vielen Stunden der Recherche fand ich eine Lösung. Es war die ganze Zeit direkt vor uns :) Es gibt eine Funktion:
popBackStack(destination, inclusive)
die zu einem bestimmten Ziel navigiert, wenn sie in backStack gefunden wird. Es gibt Boolean zurück, sodass wir manuell dorthin navigieren können, wenn der Controller das Fragment nicht findet.quelle
Ab sofort nicht verfügbar.
Um dieses Problem zu umgehen, können Sie alle abgerufenen Daten im Ansichtsmodell speichern und diese Daten beim erneuten Erstellen des Fragments sofort verfügbar machen. Stellen Sie sicher, dass Sie die Ansicht im Aktivitätskontext erhalten.
Sie können LiveData verwenden, um Ihre Datenlebenszyklusdaten beobachtbar zu machen
quelle
Ich habe den von @STAR_ZERO bereitgestellten Link verwendet und er funktioniert einwandfrei. Für diejenigen, die Probleme mit der Zurück-Schaltfläche haben, können Sie dies im Aktivitäts- / Navigations-Host wie folgt behandeln.
Überprüfen Sie einfach, ob das aktuelle Ziel Ihr Root- / Home-Fragment ist (normalerweise das erste in der unteren Navigationsansicht). Wenn nicht, navigieren Sie einfach zurück zum Fragment. Wenn ja, beenden Sie nur die App oder tun Sie, was Sie wollen.
Übrigens muss diese Lösung mit dem oben von STAR_ZERO bereitgestellten Lösungslink unter Verwendung von keep_state_fragment zusammenarbeiten .
quelle
Die von @ piotr-prus bereitgestellte Lösung hat mir geholfen, aber ich musste einige aktuelle Zielprüfungen hinzufügen:
Ohne diese Überprüfung wird das aktuelle Ziel neu erstellt, wenn Sie versehentlich dorthin navigieren, da es nicht im Backstack gefunden wird.
quelle
Wenn Sie Probleme beim Übergeben von Argumenten haben, fügen Sie Folgendes hinzu:
fragment.arguments = args
im Unterricht
KeepStateNavigator
quelle