В моем случае я должен был удалить все в задней Стопке, прежде чем я открою новый фрагмент, таким образом, я использовал этот код
navController.popBackStack(R.id.fragment_apps, true);
navController.navigate(R.id.fragment_company);
, первая строка удаляет заднюю Стопку, пока это не достигает фрагмента, указанного в моем случае, это - домашний фрагмент, таким образом, это, удаляет всю заднюю стопку полностью, и когда пользователь нажимает назад в fragment_company, он закрывает приложение.
Я думаю, что Ваш вопрос конкретно принадлежит о том, как использовать Поп-Поведение / Поп К / app:popUpTo (в xml)
В документации,
Всплывающее окно данному месту назначения перед навигацией. Это выталкивает все места назначения несоответствия от задней стопки, пока это место назначения не найдено.
Пример (Простое приложение поиска Задания)
мой график start_screen_nav похож на это:
startScreenFragment (start) -> loginFragment -> EmployerMainFragment
-> loginFragment -> JobSeekerMainFragment
, если я хочу перейти к EmployerMainFragment
и вытолкать весь включая [1 113] startScreenFragment
затем, код будет:
<action
android:id="@+id/action_loginFragment_to_employerMainFragment"
app:destination="@id/employerMainFragment"
app:popUpTo="@+id/startScreenFragment"
app:popUpToInclusive="true" />
, если я хочу перейти к EmployerMainFragment
и вытолкать весь , исключая [1 114] 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"/>
Можно переопределить спину, нажатую основного действия как это:
override fun onBackPressed() {
val navigationController = nav_host_fragment.findNavController()
if (navigationController.currentDestination?.id == R.id.firstFragment) {
finish()
} else if (navigationController.currentDestination?.id == R.id.secondFragment) {
// do nothing
} else {
super.onBackPressed()
}
}
Вот то, как я делал его.
//here the R.id refer to the fragment one wants to pop back once pressed back from the newly navigated fragment
val navOption = NavOptions.Builder().setPopUpTo(R.id.startScorecardFragment, false).build()
//now how to navigate to new fragment
Navigation.findNavController(this, R.id.my_nav_host_fragment)
.navigate(R.id.instoredBestPractice, null, navOption)
NavController navController
=Navigation.findNavController(requireActivity(),
R.id.nav_host_fragment);// initialize navcontroller
if (navController.getCurrentDestination().getId() ==
R.id.my_current_frag) //for avoid crash
{
NavDirections action =
DailyInfoSelectorFragmentDirections.actionGoToDestionationFragment();
//for clear current fragment from stack
NavOptions options = new
NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build();
navController.navigate(action, options);
}