如何正确处理导航

时间:2019-07-24 20:04:28

标签: android android-fragments kotlin android-navigation android-architecture-navigation

我有一个问题,从拥有多个片段的1个活动中导航时应该使用什么。

目标是1个托管多个片段的活动。

我正在使用导航组件架构

我的目标是知道哪种是实现导航的最佳方法

当前实现的导航方式是

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

我的问题是,这样在片段之间导航是一种好习惯吗?因为我感觉我在片段之间导航,却不关心Main容器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)
    }

让1个活动托管一堆Fragments更好,还是第一种方法更好?

我认为我是在片段中托管片段的第一种方式,使我childFragmentManager来获取这些片段的片段管理器。

这也使得从活动本身扩展某些方法变得更加困难。

谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用接口与两个片段中的closure通信,并从.prototype中进行片段事务。

答案 1 :(得分:0)

首先,您在两种方法中都执行相同的操作。从片段,活动或任何其他视图调用NavigationController都会返回相同的NavigationController

第二, Navigation Component 的重点是将导航与其包含的Activity分开。实际上,所有片段的直接父对象都是您在 xml 中定义的NavHostFragment。因此,活动与片段之间的导航无关。

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

最后,最好坚持开发人员的建议。尝试阅读documentation,您不会在任何地方看到通过活动更改目的地的信息。