导航架构组件 - 活动

Víc*_*tos 31 android android-architecture-navigation

我一直在关注导航架构组件的文档,以了解这个新导航系统的工作原理.

要从一个屏幕转到另一个屏幕,您需要一个实现NavHost接口的组件.

NavHost是一个空视图,当用户浏览您的应用程序时,目的地会被换入和换出.

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

Navigation Architecture Component的默认NavHost实现是NavHostFragment.

所以,我的问题是:

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

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

- 更新 -

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

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

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

ian*_*ake 31

导航图仅存在于单个活动中.根据" 迁移到导航"指南,<activity>目标可用于从导航图中启动活动,但是一旦启动第二个活动,它就会与原始导航图完全分开(它可能有自己的图形或只是一个简单的活动).

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

<activity
    android:id="@+id/secondActivity"
    android:name="com.example.SecondActivity" />
Run Code Online (Sandbox Code Playgroud)

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

Navigation.findNavController(view).navigate(R.id.secondActivity);
Run Code Online (Sandbox Code Playgroud)

  • 如果你在第一次活动中根本没有使用任何NavHost,那么你永远不会真正从导航中获得90%的好处,而且可能只是继续做你已经在做的事情. (3认同)
  • 您不应该使用 ActivityNavigator 本身,而应该使用 `NavController`。 (2认同)
  • 这是我的第一次尝试而且它不起作用:`{view}没有NavController设置.请注意,"视图"引用仅包含"ConstraintLayout".似乎为了工作,视图必须包含一个片段,对吗?因此,如果我不想在Activity中实例化Fragment,则在图形之间导航的唯一方法是使用`ActivityNavigator`.如果我错了,请纠正我. (2认同)
  • @ianhanniballake是否有“官方”方式完成当前活动?例如MainActivity-&gt; LoginActivity(具有自己的流程等),在执行流程后,我想关闭活动(弹出),我尝试对app:popUpTo =“ NOT_SURE_WT_SHLD_GO_HERE” app:popUpToInclusive使用“ finish_flow”动作=“ true”`但没有成功,我也确实需要这个Sep。活动,因为我不希望在此流程中使用全局导航ui元素。 (2认同)

Víc*_*tos 9

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

ActivityNavigator(this)
                    .createDestination()
                    .setIntent(Intent(this, SecondActivity::class.java))
                    .navigate(null, null)
Run Code Online (Sandbox Code Playgroud)

  • 它比 `startActivity(new Intent(this,SecondActivity.class))); 好在哪里? (42认同)
  • 现在似乎导航不可用,你有什么替代品吗! (4认同)

Kar*_*gal 5

我还使用 ActivityNavigator 成功地从一个活动导航到另一个活动,而无需托管 Fragment。

科特林:

val activityNavigator = ActivityNavigator( context!!)
                activityNavigator.navigate(
                    activityNavigator.createDestination().setIntent(
                        Intent(
                            context!!,
                            SecondActivity::class.java
                        )
                    ), null, null, null
                )
Run Code Online (Sandbox Code Playgroud)

爪哇:

ActivityNavigator activityNavigator = new ActivityNavigator(this);
activityNavigator.navigate(activityNavigator.createDestination().setIntent(new Intent(this, SecondActivity.class)), null, null, null);
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

科特林:

lateinit var navController: NavController
navController = Navigation.findNavController(view)
navController!!.navigate(R.id.action_confirmationFragment_to_secondActivity)
Run Code Online (Sandbox Code Playgroud)