Я нашел решение для этого, но оно некрасивое. Думаю, этого следовало ожидать с альфа-библиотекой, но я надеюсь, что Google постарается упростить / исправить это, поскольку это довольно популярный шаблон навигации.
Решение Алексея у меня не сработало. Моя проблема заключалась в том, что на моей панели действий отображались стрелки вверх, используя:
NavigationUI.setupActionBarWithNavController(this, navController)
Если бы я сделал, как предлагает Алексей выше, в моем новом начальном фрагменте все еще была бы стрелка, указывающая на мой начальный начальный фрагмент. Если бы я нажал эту стрелку вверх, мое приложение вроде бы перезапустилось, перейдя к самому себе (новый стартовый фрагмент)
Вот код, необходимый для того, чтобы получить то, что я хотел:
- Фрагмент №1 - это то место, где мое приложение изначально запускается
- Я могу выполнить проверку аутентификации во фрагменте №1, а затем программно изменить начало на фрагмент №2.
- Во фрагменте № 2 стрелка вверх отсутствует, и нажатие кнопки «Назад» не приведет вас к фрагменту № 1.
Вот код, который это делает. В моей деятельности onCreate:
// 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.
person
szaske
schedule
27.10.2018