Я использую новый компонент архитектуры навигации в 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);
popBackStack
или не добавлятьLoginFragment
в backstack обеспечить ,null
чтобыaddToBackStack(null);
и заменить его новымFragment
navigate()
метод, какnavigate(int resId, Bundle args, NavOptions navOptions)
и предоставить тот,NavOptions
который лучше всего подходит вашему сенариоОтветы:
Сначала добавьте атрибуты
app:popUpTo='your_nav_graph_id'
иapp:popUpToInclusive="true"
в тег действия.Во-вторых, перейдите к месту назначения, используя указанное выше действие в качестве параметра.
Дополнительную информацию см. В документации .
ПРИМЕЧАНИЕ . Если вы используете метод навигации
navigate(@IdRes int resId)
, вы не получите желаемого результата. Следовательно, я использовал методnavigate(@NonNull NavDirections directions)
.источник
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
Я думаю, ваш вопрос конкретно касается того, как использовать Pop Behavior / Pop To / app: popUpTo (в xml)
В документации
всплывающее окно до указанного пункта назначения перед навигацией. Это выталкивает все несовпадающие места назначения из заднего стека, пока это место назначения не будет найдено.
Пример (простое приложение для поиска вакансий)
мой график start_screen_nav выглядит следующим образом:
если я хочу перейти
EmployerMainFragment
и вывести все, включая,startScreenFragment
тогда код будет:если я хочу перейти
EmployerMainFragment
и вывести все, исключая,startScreenFragment
тогда код будет:если я хочу перейти
EmployerMainFragment
и открыть,loginFragment
но неstartScreenFragment
тогда, код будет:ИЛИ
источник
В моем случае мне нужно было удалить все из заднего стека, прежде чем я открою новый фрагмент, поэтому я использовал этот код
первая строка удаляет задний стек, пока он не достигнет фрагмента, указанного в моем случае, это домашний фрагмент, поэтому он полностью удаляет весь задний стек, и когда пользователь щелкает обратно в fragment_company, он закрывает приложение.
источник
fragment_apps
??ПРИМЕЧАНИЕ. Очистить задачу устарело, официальное описание
Старый ответ
Если вы не хотите пройти через весь этот пух в коде, вы можете просто проверить
Clear Task
вLaunch Options
в свойствах действия.Изменить: начиная с Android Studio 3.2 Beta 5, очистить задачу больше не отображается в окне параметров запуска, но вы все равно можете использовать ее в XML-коде навигации, в теге действия , добавив
источник
Я наконец понял это благодаря Как отключить UP в навигации для некоторого фрагмента с новым компонентом архитектуры навигации?
Мне пришлось указать .setClearTask (true) в качестве NavOption.
источник
navigate(int resId, Bundle args, NavOptions navOptions)
иNavOptions
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
может быть как логин или заставка); Кроме того, если вы хотите popBack только один, вы можете использовать:NavHostFragment.findNavController(this).popBackStack()
.Вот как я это делаю.
источник
false
?inclusive boolean: true to also pop the given destination from the back stack
Итак, я установил для параметра inclusive значение false, потому что я не хочу извлекать текущий фрагмент из стека.источник
Вы можете переопределить нажатие на спину базового действия следующим образом:
источник
Примечание: это может не относиться к самому вопросу.
Этот подход будет полезен, если для обслуживания в навигации требуется один экземпляр фрагмента .
Вот
navOptions
DSL, и его нужно импортировать. На момент ответа я использую следующие версии Gradle интерфейса навигации .источник
Некоторое время я изо всех сил пытался предотвратить возврат кнопки «Назад» к моему начальному фрагменту, который в моем случае был вводным сообщением, которое должно появиться только один раз.
Простым решением было создание глобального действия, указывающего на пункт назначения, в котором должен оставаться пользователь. Вы должны установить
app:popUpTo="..."
правильно - установить его в пункт назначения, который вы хотите получить. В моем случае это было мое вступительное сообщение. Также установитеapp:popUpToInclusive="true"
источник
Я могу объяснить это на небольшом примере. У меня есть два фрагмента списка сотрудников и удаление сотрудника. При удалении сотрудника у меня есть два события щелчка, отмена и удаление. Если я нажму «Отмена», он просто вернется к экрану списка сотрудников, а если я нажму «Удалить», я хочу очистить все предыдущие бэкстэки и перейти на экран списка сотрудников.
Для перехода к предыдущему экрану:
Чтобы очистить все предыдущие бэкстэки и перейти на новый экран:
Для получения дополнительной информации: Пример навигации Jetpack.
источник
Вы можете сделать так просто:
Если вы хотите проверить счет, вы можете сделать следующее:
источник