51

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

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

NavHost 是一个空视图,当用户在您的应用程序中导航时,目的地会被换入和换出。

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

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

所以,我的问题是:

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

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

- 更新 -

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

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

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

3 回答 3

58

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

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

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

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

Navigation.findNavController(view).navigate(R.id.secondActivity);
于 2018-05-21T16:11:01.997 回答
11

我设法从一个活动导航到另一个活动,而无需使用ActivityNavigator.

ActivityNavigator(this)
                    .createDestination()
                    .setIntent(Intent(this, SecondActivity::class.java))
                    .navigate(null, null)
于 2018-11-22T13:34:09.513 回答
5

我还设法从一个活动导航到另一个活动,而无需使用 ActivityNavigator 托管片段。

科特林:

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

爪哇:

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)
于 2019-10-30T11:28:49.370 回答