繁体   English   中英

Android BottomNavigationView 与闪屏返回堆栈问题

[英]Android BottomNavigationView with Splash Screen Back Stack Issue

因此,我使用导航组件库设置了我的BottomNavigationView (如此),一切正常,每个选项卡都可以保留其后退堆栈。 但是,如果我添加启动画面( Fragment )并且:

  1. 将其设置为起始目的地( popUpInclusive已设置为 true)
  2. 创建从SplashFragment到第一个选项卡HomeFragment的动作

然后所有选项卡不再保留它们的返回堆栈,而且导航变得奇怪:

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
    }
}

演示: https://youtu.be/AxiIsY6BtGg

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM