Ich verwende die neue Navigationsarchitekturkomponente in Android und kann den Navigationsstapel nach dem Wechsel zu einem neuen Fragment nicht mehr löschen.
Beispiel: Ich bin im loginFragment und möchte, dass dieses Fragment vom Stapel gelöscht wird, wenn ich zum Home-Fragment navigiere, damit der Benutzer nicht zum loginFragment zurückkehrt, wenn er die Zurück-Taste drückt.
Ich verwende einen einfachen NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) zum Navigieren.
Aktueller Code:
mAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
} else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
Ich habe versucht, die NavOptions in navig () zu verwenden , aber die Schaltfläche "Zurück" sendet mich immer noch zurück zum loginFragment
NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
android
android-fragments
android-architecture-components
android-architecture-navigation
Youssef El Behi
quelle
quelle
popBackStack
oder fügen Sie nichtLoginFragment
bieten Backstacknull
aufaddToBackStack(null);
und ersetzen sie durch neueFragment
navigate()
Methode wie verwendennavigate(int resId, Bundle args, NavOptions navOptions)
undNavOptions
diejenige bereitstellen, die am besten zu Ihrem Senario passtAntworten:
Fügen Sie zunächst Attribute
app:popUpTo='your_nav_graph_id'
undapp:popUpToInclusive="true"
das Aktions-Tag hinzu.Zweitens navigieren Sie zum Ziel, wobei Sie die obige Aktion als Parameter verwenden.
Weitere Informationen finden Sie in den Dokumenten .
HINWEIS : Wenn Sie mit der Methode navigieren
navigate(@IdRes int resId)
, erhalten Sie nicht das gewünschte Ergebnis. Daher habe ich Methode verwendetnavigate(@NonNull NavDirections directions)
.quelle
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
In meinem Fall musste ich alles im hinteren Stapel entfernen, bevor ich ein neues Fragment öffnete, also habe ich diesen Code verwendet
In der ersten Zeile wird der hintere Stapel entfernt, bis das in meinem Fall angegebene Fragment erreicht ist. Es handelt sich also um das Ausgangsfragment, sodass der gesamte hintere Stapel vollständig entfernt wird. Wenn der Benutzer in die fragment_company zurückklickt, schließt er die App.
quelle
fragment_apps
??Ich denke, Ihre Frage bezieht sich speziell auf die Verwendung des Pop-Verhaltens / Pop To / App: popUpTo (in xml)
In der Dokumentation
Popup zu einem bestimmten Ziel, bevor Sie navigieren. Dadurch werden alle nicht übereinstimmenden Ziele aus dem Backstack entfernt, bis dieses Ziel gefunden wird.
Beispiel (Simple Job Hunting App)
Mein Diagramm start_screen_nav sieht folgendermaßen aus:
wenn ich navigieren möchten
EmployerMainFragment
und Pop alle einschließlichstartScreenFragment
dann wird der Code sein:Wenn ich zu
EmployerMainFragment
allen navigieren und alle außer ausblenden möchte, lautetstartScreenFragment
der Code:Wenn ich zu
EmployerMainFragment
und Pop navigieren möchte,loginFragment
aber nicht,startScreenFragment
lautet der Code:ODER
quelle
HINWEIS: Die Aufgabe zum Löschen ist veraltet, die offizielle Beschreibung lautet
Alte Antwort
Wenn Sie nicht durch alle , dass Flaum im Code gehen wollen, können Sie einfach überprüfen ,
Clear Task
inLaunch Options
den Eigenschaften der Aktion.Bearbeiten: Ab Android Studio 3.2 Beta 5 ist "Aufgabe löschen" im Fenster "Startoptionen" nicht mehr sichtbar. Sie können sie jedoch im XML-Code der Navigation im Aktions- Tag durch Hinzufügen verwenden
quelle
Ich finde es endlich heraus, wie man UP in Navigation für ein Fragment mit der neuen Navigationsarchitekturkomponente deaktiviert.
Ich musste .setClearTask (true) als NavOption angeben.
quelle
navigate(int resId, Bundle args, NavOptions navOptions)
undNavOptions
val navOptions = NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build()
findNavController().navigate(R.id.my_next_frag, null, navOptions)
R.id.my_next_frag
Login oder Begrüßungsbildschirm). Auch wenn Sie nur eine popBack möchten, können Sie verwenden :NavHostFragment.findNavController(this).popBackStack()
.Hier ist, wie ich es mache.
quelle
false
?inclusive boolean: true to also pop the given destination from the back stack
setze ich das Inklusiv auf false, weil ich das aktuelle Fragment nicht vom Stapel entfernen möchte.quelle
Sie können das Zurückdrücken der Basisaktivität wie folgt überschreiben:
quelle
Hinweis: Dies bezieht sich möglicherweise nicht auf die eigentliche Frage.
Dieser Ansatz ist nützlich, wenn eine einzelne Instanz eines Fragments für die Navigation benötigt wird .
Hier
navOptions
ist DSL und muss importiert werden. Zum Zeitpunkt dieser Antwort verwende ich die folgenden Gradle-Versionen der Navigations-Benutzeroberfläche .quelle
Ich bemühte mich eine Weile, zu verhindern, dass der Zurück-Button zu meinem Startfragment zurückkehrte, was in meinem Fall eine Intro-Nachricht war, die nur einmal erscheinen sollte.
Die einfache Lösung bestand darin, eine globale Aktion zu erstellen, die auf das Ziel verweist, an dem der Benutzer bleiben soll. Sie müssen
app:popUpTo="..."
richtig einstellen - stellen Sie es auf das Ziel ein, von dem Sie abspringen möchten. In meinem Fall war es meine Intro-Nachricht. Auch eingestelltapp:popUpToInclusive="true"
quelle
Ich kann dies anhand eines kleinen Beispiels erklären. Ich habe zwei Fragmente Mitarbeiterliste und Mitarbeiter löschen. Beim Löschen eines Mitarbeiters habe ich zwei Klickereignisse abgebrochen und gelöscht. Wenn ich auf Abbrechen klicke, gehe ich einfach zurück zum Bildschirm mit der Mitarbeiterliste. Wenn ich auf Löschen klicke, möchte ich alle vorherigen Backstacks löschen und zum Bildschirm mit der Mitarbeiterliste wechseln.
Zum vorherigen Bildschirm gehen:
Um alle vorherigen Backstacks zu löschen und zum neuen Bildschirm zu wechseln:
Weitere Informationen: Jetpack-Navigationsbeispiel
quelle
Sie können so einfach machen wie:
Wenn Sie die Anzahl überprüfen möchten, können Sie Folgendes tun:
quelle