【问题标题】:How to handle navigation properly如何正确处理导航
【发布时间】:2019-07-30 14:41:29
【问题描述】:

我有一个问题,我应该使用什么来从 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()
}

然后在Fragment之间导航默认一个是这样的(从Fragment A到Fragment 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 来获取这些片段的片段管理器。

而且还使得从 Activity 本身扩展某些方法变得更加困难。

谢谢

【问题讨论】:

  • 你不需要那样实现。如果它工作正常,没问题。
  • 这是什么逻辑? “如果它有效,请留在那里......”,问题是,如果您将从事 android 开发或成为一名工程师,您需要了解最佳实践并每次都改进您的代码。
  • 好吧,我说的是导航组件。您提到的所有内容之间没有太大区别。这取决于您的编码风格。我没有看到更好的方法。

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以使用接口与来自两个片段的MainActivity 进行通信,并从MainActivity 执行片段事务。

    【讨论】:

    • hmm,将数据发送到主要活动并不是真正的问题,因为我使用共享视图模型来执行此操作,但问题是如何为导航清理干净
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2020-01-18
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多