![](/img/trans.png)
[英]Android Jetpack Navigation proper back stack with BottomNavigationView
[英]Android BottomNavigationView with Splash Screen Back Stack Issue
因此,我使用导航组件库设置了我的BottomNavigationView
(如此处),一切正常,每个选项卡都可以保留其后退堆栈。 但是,如果我添加启动画面( Fragment
)并且:
popUpInclusive
已设置为 true)然后所有选项卡不再保留它们的返回堆栈,而且导航变得奇怪:
Splash -> Home(第一个选项卡)-> Me(第二个选项卡)-> Home -> 按返回键,它会返回到我而不是退出应用程序。
PS:我使用的是带有单一导航图的单一活动模式。
好的,感谢@ianhanniballake,我在这里发布我的最终解决方案,关键是BottomNavigationView
必须是其他条件目的地(如登录或启动画面)的起始目的地。
第 1 步。创建和设置启动布局和片段
将SplashFragment
添加到导航图中。
无需从HomeFragment
-> SplashFragment
创建动作,除非你需要转换 animation
第 2 步。设置MainViewModel
(共享ViewModel
)
class MainViewModel : ViewModel() {
private var _isFirstLaunch = true //replace with the real condition in the future
val isFirstLaunch: Boolean //will be accessed by SplashFragment and HomeFragment
get() = _isFirstLaunch
fun updateIsFirstLaunch(isFirstLaunch: Boolean) {
_isFirstLaunch = isFirstLaunch
}
}
步骤 3. 设置HomeFragment
class HomeFragment : Fragment() {
private lateinit var binding: FragmentHomeBinding
private lateinit var mainViewModel: MainViewModel //shared ViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
mainViewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)
if (mainViewModel.isFirstLaunch) {
findNavController().navigate(R.id.splashFragment) //no need action, unless you want transition animation
}
binding.goButton.setOnClickListener {
findNavController().navigate(R.id.action_homeFragment_to_home2Fragment)
}
return binding.root
}
}
步骤 4. 设置SplashFragment
class SplashFragment : Fragment() {
private lateinit var binding: FragmentSplashBinding
private lateinit var mainViewModel: MainViewModel //shared ViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_splash, container, false)
mainViewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)
binding.exitSplashButton.setOnClickListener {
mainViewModel.updateIsFirstLaunch(false) //update the condition
findNavController().navigateUp() //go back to HomeFragment
}
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
requireActivity().finish()
}
return binding.root
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.