首页 > 解决方案 > 如何正确处理导航

问题描述

我有一个问题,我应该使用什么来从 1 个托管多个片段的 Activity 导航。

目标是 1 个承载多个片段的 Activity。

我正在使用导航组件架构

我的目标是知道哪个是实现导航的最佳方式

当前实现的导航方式是这样的

class MainMenuActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_menu)
    }

    override fun onSupportNavigateUp() = findNavController(R.id.nav_host_fragment).navigateUp()
}

然后在膨胀默认片段后在片段之间导航是这样的(从片段 A 到片段 B

Fragment A : Fragment() {

onViewCreated(...){
 btn.setOnClickListener{
 findNavController.navigate(R.id.nextAction)
}

从片段 B 到片段 C

Fragment B : Fragment() {

    onViewCreated(...){
     btn.setOnClickListener{
     findNavController.navigate(R.id.nextAction)
    }

我的问题是,以这种方式在片段之间导航是否是一种好习惯?因为我觉得我在片段之间进行导航,但不关心主容器 Activity。

我想做的是这样的

class MainMenuActivity : BaseActivity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main_menu)
        }

        override fun onSupportNavigateUp() = findNavController(R.id.nav_host_fragment).navigateUp()

        fun navigateToFragment(id:Int){
          findNavController.navigate(id)
        }

    }

然后从每个片段中调用它以到达所需的目的地

 Fragment A : Fragment() {

    onViewCreated(...){
     btn.setOnClickListener{
     requireActivity().navigateToFragment(R.id.nextAction)
    }

拥有一个托管一堆片段的活动是否更好,还是第一种方式更好?

这样做是我认为我在片段中托管片段的第一种方式,这使我childFragmentManager能够获得这些片段的片段管理器。

并且也使得从活动本身扩展一些方法变得更加困难。

谢谢

标签: androidandroid-fragmentskotlinandroid-navigationandroid-architecture-navigation

解决方案


首先,您在两种方法中都在做同样的事情。NavigationController如果重要,从片段、活动或任何其他视图调用将返回相同的结果NavigationController

其次,导航组件的重点是将导航与其包含的活动分开。事实上,所有片段的直接父级都是您在xmlNavHostFragment中定义的。因此,活动与在片段之间导航无关。

第三,在导航时无论是“第一种方式”还是“第二种方式”(从技术上讲,它们与我在第一点中提到的相同)并不意味着您在片段中托管片段。相反,导航组件会在您每次访问新目的地时用新片段替换您的容器。

最后,最好坚持开发人员的建议。尝试阅读文档,您看不到他们通过 Activity 更改目的地的任何地方。


推荐阅读