导航架构组件 - 活动

Navigation Architecture Component - Activities

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

为了 go/back 从一个屏幕到另一个屏幕,您需要一个实现 NavHost 接口的组件。

The NavHost is an empty view whereupon destinations are swapped in and out as a user navigates through your app.

但是,目前好像只有Fragments实现了NavHost

The Navigation Architecture Component’s default NavHost implementation is NavHostFragment.

所以,我的问题是:

--更新--

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

Separate Activities can then be linked by adding activity destinations to the navigation graph, replacing existing usages of startActivity() throughout the code base.

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

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

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

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

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

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

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

我还设法从一个 activity 导航到另一个 activity,而无需使用 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)