Używam nowego komponentu architektury nawigacji w systemie Android i utknąłem w czyszczeniu stosu nawigacji po przejściu do nowego fragmentu.
Przykład: Jestem w loginFragment i chcę, aby ten fragment został usunięty ze stosu, kiedy przejdę do fragmentu głównego, aby użytkownik nie powrócił do loginFragmentu po naciśnięciu przycisku Wstecz.
Do nawigacji używam prostego NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) .
Aktualny kod:
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());
}
}
});
Próbowałem użyć NavOptions w nawigacji () , ale przycisk Wstecz nadal odsyła mnie z powrotem do 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
źródło
źródło
popBackStack
lub nie dodawaćLoginFragment
do backstack dostarczyćnull
doaddToBackStack(null);
i zastąpić ją nowąFragment
navigate()
metody takiej jaknavigate(int resId, Bundle args, NavOptions navOptions)
i zapewnić to,NavOptions
co najlepiej pasuje do twojego senarioOdpowiedzi:
Najpierw dodaj atrybuty
app:popUpTo='your_nav_graph_id'
iapp:popUpToInclusive="true"
do tagu akcji.Po drugie, przejdź do celu, używając powyższej czynności jako parametru.
Więcej informacji można znaleźć w dokumentacji .
UWAGA : Jeśli nawigujesz za pomocą metody
navigate(@IdRes int resId)
, nie uzyskasz pożądanego rezultatu. Dlatego użyłem metodynavigate(@NonNull NavDirections directions)
.źródło
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
Myślę, że twoje pytanie dotyczy konkretnie sposobu korzystania z funkcji Pop Behavior / Pop To / app: popUpTo (w xml)
W dokumentacji
wyskakuj do określonego celu przed rozpoczęciem nawigacji. Spowoduje to zdejmowanie wszystkich niepasujących miejsc docelowych z tylnego stosu, aż do znalezienia tego miejsca docelowego.
Przykład (aplikacja do prostego poszukiwania pracy)
mój wykres start_screen_nav wygląda następująco:
jeśli chcę przejść do
EmployerMainFragment
i wyświetlić wszystko, w tym,startScreenFragment
kod będzie wyglądał następująco:jeśli chcę przejść do
EmployerMainFragment
i wyświetlić wszystkie z wyłączeniem,startScreenFragment
kod będzie wyglądał następująco:jeśli chcę przejść do
EmployerMainFragment
i wyskoczyć,loginFragment
ale nie,startScreenFragment
kod będzie wyglądał następująco:LUB
źródło
W moim przypadku musiałem usunąć wszystko z tylnego stosu, zanim otworzyłem nowy fragment, więc użyłem tego kodu
pierwsza linia usuwa tylny stos, dopóki nie osiągnie fragmentu określonego w moim przypadku, jest to fragment domowy, więc całkowicie usuwa cały tylny stos, a kiedy użytkownik kliknie z powrotem we fragment_company, zamyka aplikację.
źródło
fragment_apps
??UWAGA: Wyczyść zadanie jest przestarzałe, oficjalny opis już
Stara odpowiedź
Jeśli nie chce przejść przez cały ten fuzz w kodzie, można po prostu sprawdzić
Clear Task
wLaunch Options
we właściwościach działania.Edycja: Począwszy od Android Studio 3.2 Beta 5, Wyczyść zadanie nie jest już widoczne w oknie Opcje uruchamiania, ale nadal można go używać w kodzie XML nawigacji, w tagu akcji , dodając
źródło
W końcu to rozgryzłem dzięki Jak wyłączyć UP w nawigacji dla jakiegoś fragmentu za pomocą nowego komponentu architektury nawigacji?
Musiałem określić .setClearTask (true) jako NavOption.
źródło
navigate(int resId, Bundle args, NavOptions navOptions)
iNavOptions
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
Może to być login lub ekran powitalny); także jeśli chcesz popBack tylko jeden, można użyć:NavHostFragment.findNavController(this).popBackStack()
.Oto, jak to robię.
źródło
false
?inclusive boolean: true to also pop the given destination from the back stack
Ustawiłem więc włączanie na false, ponieważ nie chcę zdejmować bieżącego fragmentu ze stosu.źródło
Możesz zastąpić naciśnięcie wstecz działania podstawowego w następujący sposób:
źródło
Uwaga: to może nie odnosić się do rzeczywistego pytania.
To podejście będzie przydatne, jeśli do utrzymania w nawigacji potrzebna jest pojedyncza instancja fragmentu .
Tutaj
navOptions
jest DSL i należy go zaimportować. W chwili udzielania tej odpowiedzi używam następujących wersji interfejsu nawigacji w Gradle .źródło
Przez chwilę walczyłem, aby przycisk Wstecz nie wrócił do mojego fragmentu początkowego, który w moim przypadku był wiadomością wprowadzającą, która powinna pojawić się tylko raz.
Prostym rozwiązaniem było stworzenie globalnej akcji wskazującej miejsce docelowe, w którym powinien pozostać użytkownik. Musisz ustawić
app:popUpTo="..."
poprawnie - ustaw go na miejsce, w którym chcesz zostać wyskakujący. W moim przypadku była to moja wiadomość wprowadzająca. Ustaw równieżapp:popUpToInclusive="true"
źródło
Mogę to wyjaśnić na małym przykładzie. Mam dwa fragmenty listy pracowników i usuwanie pracowników. W przypadku usuwania pracownika mam dwa zdarzenia kliknięcia: anuluj i usuń. Jeśli kliknę Anuluj, po prostu wrócę do ekranu listy pracowników, a jeśli kliknę Usuń, chcę wyczyścić wszystkie poprzednie backstacks i przejść do ekranu listy pracowników.
Aby przejść do poprzedniego ekranu:
Aby wyczyścić wszystkie poprzednie backstack i przejść do nowego ekranu:
Więcej informacji: Przykład nawigacji Jetpack
źródło
Możesz zrobić tak proste, jak:
Jeśli chcesz sprawdzić licznik, możesz:
źródło