好的,感谢@ianhanniballake,我在这里发布了我的最终解决方案,关键是BottomNavigationView
必须是起始目的地而不是其他目的地有条件的目的地 https://developer.android.com/guide/navigation/navigation-conditional例如登录或启动屏幕。
步骤 1. 创建并设置 Splash 布局和片段
步骤 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
}
}
Demo: https://youtu.be/AxiIsY6BtGg https://youtu.be/AxiIsY6BtGg