Як очистити навігацію Стек після переходу до іншого фрагмента в Android

Я використовую новий компонент навігаційної архітектури в android, і я застряг у очищенні навігації, що залишився після переходу на новий фрагмент.

Приклад: Я перебуваю в фрагменті входу, і я хочу, щоб цей фрагмент був очищений від застрягання, коли я переходив до домашнього фрагмента, щоб користувач не повернувся назад до фрагмента входу, коли він натискає кнопку назад.

Я використовую просту NavHostFragment.findNavController (фрагмент) .navigate (R.id.homeFragment) для навігації

Поточний код:

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if (task.isSuccessful()) {

                            NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());

                    }

                }
            });

Я спробував використати NavOptions у навігація() , але кнопка" Назад "продовжує відправляти мене назад

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);
2
У графіку навігації можна додати додаток: popUpTo = "@ + id/wantedFragment" для дії homeFragment, коли користувач натисне назад, він перейде до потрібного фрагмента і не ввійде в фрагмент
додано Автор Alex, джерело
У графіку навігації можна додати додаток: popUpTo = "@ + id/wantedFragment" для дії homeFragment, коли користувач натисне назад, він перейде до потрібного фрагмента і не ввійде в фрагмент
додано Автор Alex, джерело
У графіку навігації можна додати додаток: popUpTo = "@ + id/wantedFragment" для дії homeFragment, коли користувач натисне назад, він перейде до потрібного фрагмента і не ввійде в фрагмент
додано Автор Alex, джерело
Ви можете використовувати popBackStack або не додавати LoginFragment до backstack, надаючи null до addToBackStack (null); і замінити з новим Фрагментом
додано Автор Yupi, джерело
Ви можете використовувати popBackStack або не додавати LoginFragment до backstack, надаючи null до addToBackStack (null); і замінити з новим Фрагментом
додано Автор Yupi, джерело
Я думаю, що @Yupi дав хорошу пропозицію. Або ви можете скористатися методом navigate() , наприклад навігація (int resId, аргументи Bundle, NavOptions navOptions) , і вкажіть NavOptions , які найкраще підходять senario
додано Автор Barns, джерело
Я думаю, що @Yupi дав хорошу пропозицію. Або ви можете скористатися методом navigate() , наприклад навігація (int resId, аргументи Bundle, NavOptions navOptions) , і вкажіть NavOptions , які найкраще підходять senario
додано Автор Barns, джерело
Я думаю, що @Yupi дав хорошу пропозицію. Або ви можете скористатися методом navigate() , наприклад навігація (int resId, аргументи Bundle, NavOptions navOptions) , і вкажіть NavOptions , які найкраще підходять senario
додано Автор Barns, джерело
Відредагуйте свою публікацію та додайте код, який ви використовуєте для навігації
додано Автор Barns, джерело
Відредагуйте свою публікацію та додайте код, який ви використовуєте для навігації
додано Автор Barns, джерело
Я відредагував своє запитання та додав код
додано Автор Youssef El Behi, джерело
@Alex Я намагався робити це, але це не має ніяких ефектів.
додано Автор Youssef El Behi, джерело
@Alex Я намагався робити це, але це не має ніяких ефектів.
додано Автор Youssef El Behi, джерело
@Alex Я намагався робити це, але це не має ніяких ефектів.
додано Автор Youssef El Behi, джерело
Я спробував використати NavOptions, але кнопка "Назад" все ще посилає мене назад на loginFragment
додано Автор Youssef El Behi, джерело
Я спробував використати NavOptions, але кнопка "Назад" все ще посилає мене назад на loginFragment
додано Автор Youssef El Behi, джерело
Я спробував використати NavOptions, але кнопка "Назад" все ще посилає мене назад на loginFragment
додано Автор Youssef El Behi, джерело
Я відредагував своє запитання та додав код
додано Автор Youssef El Behi, джерело
Я відредагував своє запитання та додав код
додано Автор Youssef El Behi, джерело

9 Відповіді

Якщо ви не хочете переглядати весь цей fuzz в коді, можна просто позначити пункт Clear Task у Параметри запуску у властивостях дії.

Launch Options

Edit: As of Android Studio 3.2 Beta 5, Clear Task is no longer visible in Launch Options window, but you can still use it in navigation's xml code, in action tag, by adding

app:clearTask="true"

Edit 2: Clear task is deprecated, official description is

Цей метод застарілий. Використовуйте setPopUpTo (int, boolean) з ідентифікатором графіка NavController і встановіть включно до true.

3
додано
Ви повинні використовувати ідентифікатор кореня графіка замість того, щоб повідомлення атрибута clearTask xml сказало: "встановіть popUpTo в корінь вашого графіка і використовуйте popUpToInclusive". Я зробив це так і добився тієї самої бажаної поведінки з findNavController (). Navigate (@IdRes resId, bundle)
додано Автор Skyfall100, джерело

Якщо ви не хочете переглядати весь цей fuzz в коді, можна просто позначити пункт Clear Task у Параметри запуску у властивостях дії.

Launch Options

Edit: As of Android Studio 3.2 Beta 5, Clear Task is no longer visible in Launch Options window, but you can still use it in navigation's xml code, in action tag, by adding

app:clearTask="true"

Edit 2: Clear task is deprecated, official description is

Цей метод застарілий. Використовуйте setPopUpTo (int, boolean) з ідентифікатором графіка NavController і встановіть включно до true.

3
додано
Ви повинні використовувати ідентифікатор кореня графіка замість того, щоб повідомлення атрибута clearTask xml сказало: "встановіть popUpTo в корінь вашого графіка і використовуйте popUpToInclusive". Я зробив це так і добився тієї самої бажаної поведінки з findNavController (). Navigate (@IdRes resId, bundle)
додано Автор Skyfall100, джерело

Якщо ви не хочете переглядати весь цей fuzz в коді, можна просто позначити пункт Clear Task у Параметри запуску у властивостях дії.

Launch Options

Edit: As of Android Studio 3.2 Beta 5, Clear Task is no longer visible in Launch Options window, but you can still use it in navigation's xml code, in action tag, by adding

app:clearTask="true"

Edit 2: Clear task is deprecated, official description is

Цей метод застарілий. Використовуйте setPopUpTo (int, boolean) з ідентифікатором графіка NavController і встановіть включно до true.

3
додано
Ви повинні використовувати ідентифікатор кореня графіка замість того, щоб повідомлення атрибута clearTask xml сказало: "встановіть popUpTo в корінь вашого графіка і використовуйте popUpToInclusive". Я зробив це так і добився тієї самої бажаної поведінки з findNavController (). Navigate (@IdRes resId, bundle)
додано Автор Skyfall100, джерело

I finally figure it out thanks to How to disable UP in Navigation for some fragment with the new Navigation Architecture Component?

Мені довелося вказати .setClearTask (true) як NavOption.

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "signInWithCredential:success");


                        NavOptions.Builder navBuilder = new NavOptions.Builder();
                        NavOptions navOptions = navBuilder.setClearTask(true).build();
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment,null,navOptions);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());

                    }

                }
            });
2
додано
Раді бачити, що ви змогли реалізувати мою пропозицію, використовуючи навігацію (int resId, аргументи Bundle, NavOptions navOptions) і NavOptions
додано Автор Barns, джерело
Зауважимо, що функція setClearTask вже застаріла
додано Автор Jon Dunn, джерело
Так. Завдяки @Barns
додано Автор Youssef El Behi, джерело

I finally figure it out thanks to How to disable UP in Navigation for some fragment with the new Navigation Architecture Component?

Мені довелося вказати .setClearTask (true) як NavOption.

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "signInWithCredential:success");


                        NavOptions.Builder navBuilder = new NavOptions.Builder();
                        NavOptions navOptions = navBuilder.setClearTask(true).build();
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment,null,navOptions);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());

                    }

                }
            });
2
додано
Раді бачити, що ви змогли реалізувати мою пропозицію, використовуючи навігацію (int resId, аргументи Bundle, NavOptions navOptions) і NavOptions
додано Автор Barns, джерело
Зауважимо, що функція setClearTask вже застаріла
додано Автор Jon Dunn, джерело
Так. Завдяки @Barns
додано Автор Youssef El Behi, джерело

I finally figure it out thanks to How to disable UP in Navigation for some fragment with the new Navigation Architecture Component?

Мені довелося вказати .setClearTask (true) як NavOption.

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "signInWithCredential:success");


                        NavOptions.Builder navBuilder = new NavOptions.Builder();
                        NavOptions navOptions = navBuilder.setClearTask(true).build();
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment,null,navOptions);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());

                    }

                }
            });
2
додано
Раді бачити, що ви змогли реалізувати мою пропозицію, використовуючи навігацію (int resId, аргументи Bundle, NavOptions navOptions) і NavOptions
додано Автор Barns, джерело
Зауважимо, що функція setClearTask вже застаріла
додано Автор Jon Dunn, джерело
Так. Завдяки @Barns
додано Автор Youssef El Behi, джерело

Спочатку додайте атрибути app: popUpTo = 'your_nav_graph_id' та app: popUpToInclusive = "true" до тега дій.


    

По-друге, перейдіть до пункту призначення, використовуючи вищевказану дію як параметр.

findNavController(fragment).navigate(SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

NOTE: If you navigate using method navigate(@IdRes int resId), you won't get the desired result. Hence, I used method navigate(@NonNull NavDirections directions).

0
додано

Спочатку додайте атрибути app: popUpTo = 'your_nav_graph_id' та app: popUpToInclusive = "true" до тега дій.


    

По-друге, перейдіть до пункту призначення, використовуючи вищевказану дію як параметр.

findNavController(fragment).navigate(SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

NOTE: If you navigate using method navigate(@IdRes int resId), you won't get the desired result. Hence, I used method navigate(@NonNull NavDirections directions).

0
додано

Спочатку додайте атрибути app: popUpTo = 'your_nav_graph_id' та app: popUpToInclusive = "true" до тега дій.


    

По-друге, перейдіть до пункту призначення, використовуючи вищевказану дію як параметр.

findNavController(fragment).navigate(SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

NOTE: If you navigate using method navigate(@IdRes int resId), you won't get the desired result. Hence, I used method navigate(@NonNull NavDirections directions).

0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.