导航架构组件 - 活动

56
我一直在关注来自 Navigation Architecture Component 的文档,以了解这个新导航系统的工作原理。
要从一个屏幕导航到另一个屏幕,您需要一个实现NavHost接口的组件。
  

NavHost是一个空视图,在其中目的地随着用户浏览应用程序而被替换和移除。

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

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

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

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

--更新--

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

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

  • 使用ActivityNavigator是否比使用startActivity有任何好处?
  • 在使用nav组件时从活动之间转移的正确方法是什么?

Google现在推荐每个应用程序只使用一个活动,所以我不确定他们会从Activity中实现NavHost。 - Samuel Eminet
1
是的,我知道,但大多数应用程序都使用多个活动来实现。因此,从一个实现移动到另一个完全需要时间。因此,设置这个桥梁可以帮助过渡。 - Víctor Albertos
到了2023年,如果我们有多模块应用程序,使用导航组件与活动转换并不是那么出色(由于存在大量逻辑而无法从中移动),而且活动作为一种反模式是否过时? - Beemo
3个回答

66

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

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

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

然后,您可以像访问其他目的地一样使用它,导航到该活动(即开始该活动):

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

2
您不应该直接使用ActivityNavigator本身,而是与“NavController”一起工作。 - ianhanniballake
2
那是我的第一次尝试,但它没有成功:{view} does not have a NavController set。请注意,“view”引用仅包含一个ConstraintLayout。似乎为了使其工作,视图必须包含一个Fragment,对吗?因此,如果我不想在Activity中实例化Fragment,则在图形之间导航的唯一方法是使用ActivityNavigator。如果我有错,请纠正我。 - Víctor Albertos
3
如果您在第一个活动中没有使用任何NavHost,则实际上永远无法获得90%的导航好处,因此您应该继续做您已经在做的事情。请注意, NavHost 是 Android Navigation 组件中的一部分,用于管理导航和 Fragment 生命周期。 - ianhanniballake
1
@SouravBagchi - NavController仅存在于单个Activity中,因此无法访问不同Activity的NavController。 - ianhanniballake
4
@ianhanniballake,有没有正式的方法来完成当前的Activity?例如,从MainActivity流转到LoginActivity(有自己的流程等),在完成流程后,我想关闭Activity(弹出它)。我尝试使用app:popUpTo="NOT_SURE_WT_SHLD_GO_HERE"app:popUpToInclusive="true"与"finish_flow"操作,但没有成功。同时,在此流程中,我真的需要这个独立的Activity,因为我不想在全局导航UI元素中显示它。 - Joaquim Ley
显示剩余7条评论

13

我使用ActivityNavigator成功地在不使用Fragment的情况下从一个活动导航到另一个活动。

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

4
似乎导航现在不可用,你有任何替代方案吗? - CoDe
54
startActivity(new Intent(this,SecondActivity.class)); 相比,它有什么优势? - rahimli
太好了,我这里假设SecondActivity是一个导航宿主,那么是否可以导航到SecondActivity内部的Fragment呢? - a-rohim
在使用 ActivityNavigator(this).navigate(destination) 前,您需要使用 val destination = ActivityNavigator(this).createDestination().setIntent(Intent(this, SecondActivity::class.java)) 创建目标。 - Fatih

5
我使用ActivityNavigator在不使用Fragment的情况下成功地从一个活动导航到另一个活动。
Kotlin:
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" />

Kotlin:

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

我在 NavGraph 中遇到了一个错误:没有当前导航节点 - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接