Как очистить стек навигации после перехода к другому фрагменту в Android - PullRequest
0 голосов
/ 24 мая 2018

Я использую новый Компонент архитектуры навигации в Android, и я застрял в очистке стека навигации после перехода к новому фрагменту.

Пример: я нахожусь в loginFragment и хочу, чтобы этот фрагмент был очищен из стека при переходе к домашнему фрагменту, чтобы пользователь не был возвращен обратно в loginFragment при нажатии кнопки «Назад».

Я использую простой NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) для навигации.

Текущий код:

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());
                    }
                }
            });

Я пытался использовать NavOptions в navigate () , но кнопка «Назад» все еще отправляет меня обратно в 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);

Ответы [ 5 ]

0 голосов
/ 28 июля 2019

В моем случае мне нужно было удалить все в заднем стеке, прежде чем я открою новый фрагмент, поэтому я использовал этот код

navController.popBackStack(R.id.fragment_apps, true);
navController.navigate(R.id.fragment_company);

первая строка удаляет задний стек, пока он не достигнет фрагмента, указанного в моемЕсли это домашний фрагмент, то он полностью удаляет весь задний стек, и когда пользователь щелкает обратно в фрагменте, он закрывает приложение.

0 голосов
/ 01 июля 2019

Я думаю, что ваш вопрос конкретно касается того, как использовать поведение Pop Pop / app To / app: popUpTo (в xml)

В документации
всплыть до заданного места назначения перед навигацией,При этом все несоответствующие пункты назначения извлекаются из заднего стека до тех пор, пока этот пункт назначения не будет найден.

Пример (простое приложение для поиска работы)
my start_screen_nav график выглядит так:

startScreenFragment (start) -> loginFragment -> EmployerMainFragment

                            -> loginFragment -> JobSeekerMainFragment

если я хочу перейти на EmployerMainFragment и выдать все , включая startScreenFragment, тогда код будет:

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"
            app:popUpToInclusive="true" />

если я хочу перейти к EmployerMainFragment и выдать все , исключая startScreenFragment, тогда код будет:

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"/>

, если я хочу перейти к EmployerMainFragment и всплыть loginFragment но не startScreenFragment, тогда код будет:

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/loginFragment"
            app:popUpToInclusive="true"/>

ИЛИ

        <action
            android:id="@+id/action_loginFragment_to_employerMainFragment"
            app:destination="@id/employerMainFragment"

            app:popUpTo="@+id/startScreenFragment"/>
0 голосов
/ 07 июня 2018

ПРИМЕЧАНИЕ: Очистить задание не рекомендуется, официальное описание:

Этот метод устарел.Используйте setPopUpTo (int, boolean) с идентификатором графика NavController и установите для inclusive значение true.

Старый ответ

Если вы не хотите идтичерез весь этот нечеткий код в коде вы можете просто проверить Clear Task в Launch Options в свойствах действия.

Launch Options

Редактировать: Начиная с Android Studio 3.2 Beta 5, Clear Task больше не отображается в окне параметров запуска, но вы все равно можете использовать его в XML-коде навигации, в теге action , добавив

app:clearTask="true"
0 голосов
/ 22 августа 2018

Сначала добавьте атрибуты app:popUpTo='your_nav_graph_id' и app:popUpToInclusive="true" к тегу действия.

<fragment
    android:id="@+id/signInFragment"
    android:name="com.glee.incog2.android.fragment.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_usersFragment"
        app:destination="@id/usersFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/main_nav_graph"
        app:popUpToInclusive="true" />
</fragment>

Во-вторых, перейдите к месту назначения, используя указанное выше действие в качестве параметра.

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

См. документы для получения дополнительной информации.

ПРИМЕЧАНИЕ : Если вы перемещаетесь по методу navigate(@IdRes int resId), вы не получите желаемого результата.Следовательно, я использовал метод navigate(@NonNull NavDirections directions).

0 голосов
/ 25 мая 2018

Я наконец понял это благодаря Как отключить UP в Navigation для некоторого фрагмента с новым компонентом архитектуры навигации?

Мне пришлось указать .setClearTask (true) в качестве NavOption.

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> 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());

                    }

                }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...