Я нашел решение для этого, но это некрасиво. Я предполагаю, что этого следует ожидать с альфа-библиотекой, но я надеюсь, что Google пытается упростить / исправить это, поскольку это довольно популярный шаблон навигации.
Решение Алексея у меня не сработало. Моя проблема заключалась в том, что на панели действий отображаются стрелки вверх с помощью:
NavigationUI.setupActionBarWithNavController(this, navController)
Если бы я сделал так, как предлагает Алексей, у моего нового стартового фрагмента все еще была стрелка, указывающая на мой начальный стартовый фрагмент. Если бы я нажал эту стрелку вверх, мое приложение перезапустилось бы, перейдя к себе (новый начальный фрагмент)
Вот код, необходимый для того, чтобы получить то, что я хотел:
- Фрагмент # 1, где мое приложение изначально запускается
- Я могу выполнить проверку подлинности во фрагменте № 1, а затем программно изменить начало фрагмента № 2.
- Однажды во Фрагменте # 2 стрелка вверх не появляется, и нажатие кнопки «Назад» не приведет вас к Фрагменту № 1.
Вот код, который выполняет это. В моей деятельности по созданию:
// Setup the toolbar
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(false)
// Configure the navigation
val navHost = nav_host_fragment as NavHostFragment
graph = navHost.navController
.navInflater.inflate(R.navigation.nav_graph)
graph.startDestination = R.id.welcomeFragment
// This seems to be a magical command. Not sure why it's needed :(
navHost.navController.graph = graph
NavigationUI.setupActionBarWithNavController(this, navHost.navController)
а также:
fun makeHomeStart(){
graph.startDestination = R.id.homeFragment
}
Затем во фрагменте № 1 onActivityCreated, согласно предложению Алексея:
override fun onActivityCreated(savedInstanceState: Bundle?) {
...
// Check for user authentication
if(sharedViewModel.isUserAuthenticated()) {
(activity as MainActivity).makeHomeStart() //<---- THIS is the key
val navOptions = NavOptions.Builder()
.setPopUpTo(R.id.welcomeFragment, true)
.build()
navController.navigate(R.id.action_welcomeFragment_to_homeFragment,null,navOptions)
} else {
navController.navigate(R.id.action_welcomeFragment_to_loginFragment)
}
}
Код ключа:
(activity as MainActivity).makeHomeStart()
, который просто запускает метод в действии, который изменяет графики startDestination. Я мог бы очистить это и превратить в интерфейс, но я буду ждать Google и надеюсь, что они улучшат весь этот процесс. Метод setPopUpTo кажется мне плохо названным, и не интуитивно понятно, что вы называете фрагмент, который вырезан из графика. Мне также странно, что они вносят эти изменения в navOptions. Я думаю, что navOptions будет относиться только к действиям навигации, к которым они подключены.
И я даже не знаю, что делает navHost.navController.graph = graph
, но без него стрелки вверх возвращаются. (
Я использую Navigation 1.0.0-alpha06.