【问题标题】:Navigation Architecture Component - Activities导航架构组件 - 活动
【发布时间】:2020-04-22 09:04:29
【问题描述】:

我一直在关注Navigation Architecture Component 的文档,以了解这个新导航系统的工作原理。

要从一个屏幕返回/返回另一个屏幕,您需要一个实现NavHost 接口的组件。

NavHost 是一个空视图,目的地被交换并 在用户浏览您的应用时退出。

但是,目前似乎只有 Fragments 实现了NavHost

导航架构组件的默认 NavHost 实现是 NavHostFragment。

所以,我的问题是:

  • 即使我有一个可以用Activity 实现的非常简单的屏幕,为了使用这个新的导航系统,是否需要托管一个包含实际视图的Fragment

  • Activity 会在不久的将来实现NavHost 接口吗?

--已更新--

根据 ianhanniballake 的回答,我了解每个活动都包含自己的导航图。但是如果我想使用导航组件从一个活动转到另一个活动(替换“旧”startActivity 调用),我可以使用activity destinationsactivity destinations 是什么我不清楚,因为 docs for migration 没有详细说明:

然后可以通过将活动目的地添加到导航图来链接单独的活动,替换整个代码库中 startActivity() 的现有用法。

  • 使用ActivityNavigator 代替startActivity 有什么好处吗?
  • 使用导航组件时,从活动中走出来的正确方法是什么?

【问题讨论】:

  • Google 现在建议每个应用使用一个 Activity,所以我不确定它们是否会阻碍来自 Activity 的 NavHost
  • 是的,我知道,但大多数应用程序都是使用多个活动实现的。因此,从一种实现完全转移到另一种实现需要时间。因此,架设这座桥梁可能有助于过渡。

标签: android android-architecture-navigation


【解决方案1】:

导航图仅存在于单个活动中。根据Migrate to Navigation guide<activity> 目的地可用于从导航图中启动 Activity,但一旦启动第二个 Activity,它就与原始导航图完全分离(它可以有自己的图或只是是一个简单的活动)。

您可以通过可视化编辑器(通过点击 + 按钮,然后在项目中选择一个活动)或手动添加 XML 将活动目标添加到导航图:

<activity
    android:id="@+id/secondActivity"
    android:name="com.example.SecondActivity" />

然后,您可以像使用任何其他目的地一样导航到该活动(即启动活动):

Navigation.findNavController(view).navigate(R.id.secondActivity);

【讨论】:

  • 您不应该使用 ActivityNavigator 本身,而应该只使用 NavController
  • 这是我的第一次尝试,但没有成功:{view} does not have a NavController set。请注意,“视图”引用仅包含 ConstraintLayout。似乎为了工作,视图必须包含一个片段,对吧?因此,如果我不想在 Activity 中实例化 Fragment,则在图表之间导航的唯一方法是使用 ActivityNavigator 。如果我错了,请纠正我。
  • 如果您甚至在第一次活动中根本没有使用任何 NavHost,那么您将永远无法真正从 Navigation 中获得 90% 的收益,并且可能应该继续做您想做的事情已经在做。
  • @SouravBagchi - NavController 仅存在于单个 Activity 中,因此无法访问其他 Activity 的 NavController。
  • @ianhanniballake 是否有“官方”方式来完成当前活动?例如MainActivity -> LoginActivity(有自己的流程等)在完成流程之后我想关闭活动(弹出它)我尝试使用 app:popUpTo="NOT_SURE_WT_SHLD_GO_HERE" app:popUpToInclusive="true" 的“finish_flow”操作但没有成功,我也真的需要这个九月活动,因为我不希望在此流程中使用全局导航 ui 元素。
【解决方案2】:

我设法通过使用ActivityNavigator 在不托管 Fragment 的情况下从一个活动导航到另一个活动。

ActivityNavigator(this)
                    .createDestination()
                    .setIntent(Intent(this, SecondActivity::class.java))
                    .navigate(null, null)

【讨论】:

  • 现在好像navigation不可用了,你有替代品吗!
  • 怎么比startActivity(new Intent(this,SecondActivity.class));好?
  • 这很好,在我的情况下假设 SecondActivity 是一个导航主机,是否可以导航到 SecondActivity 内的片段?
  • 您可以在使用val destination = ActivityNavigator(this).createDestination().setIntent(Intent(this, SecondActivity::class.java)) 创建目的地后使用ActivityNavigator(this).navigate(destination)
【解决方案3】:

我还设法在不使用 ActivityNavigator 托管 Fragment 的情况下从一个活动导航到另一个活动。

科特林:

val activityNavigator = ActivityNavigator( context!!)
                activityNavigator.navigate(
                    activityNavigator.createDestination().setIntent(
                        Intent(
                            context!!,
                            SecondActivity::class.java
                        )
                    ), null, null, null
                )

Java:

ActivityNavigator activityNavigator = new ActivityNavigator(this);
activityNavigator.navigate(activityNavigator.createDestination().setIntent(new Intent(this, SecondActivity.class)), null, null, null);

nav_graph.xml

<fragment android:id="@+id/fragment"
        android:name="com.codingwithmitch.navigationcomponentsexample.SampleFragment"
        android:label="fragment_sample"
        tools:layout="@layout/fragment_sample">

    <action
            android:id="@+id/action_confirmationFragment_to_secondActivity"
            app:destination="@id/secondActivity" />

</fragment>
<activity
        android:id="@+id/secondActivity"
        android:name="com.codingwithmitch.navigationcomponentsexample.SecondActivity"
        android:label="activity_second"
        tools:layout="@layout/activity_second" />

科特林:

lateinit var navController: NavController
navController = Navigation.findNavController(view)
navController!!.navigate(R.id.action_confirmationFragment_to_secondActivity)

【讨论】:

  • 我在 NavGraph 中收到错误:没有当前导航节点
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2018-12-22
  • 2018-12-13
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2019-10-15
  • 2019-01-06
相关资源
最近更新 更多