如何在Jetpack中使用导航启动第二个活动

时间:2018-05-30 08:28:45

标签: android android-architecture-components android-jetpack android-architecture-navigation

您知道现在是官方消息:Google正式推荐单一活动应用架构。但这里有一种困难。我们有各种活动。所以,当我想用​​多个活动实现导航时,但我失败了。

他们说:在多个活动共享相同布局的情况下,可以组合导航图,将导航调用替换为活动目标,以直接在两个导航图之间导航调用。 in here

所以我创造了这个:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/nav_graph_firstActvity">

<activity
    android:id="@+id/nav_graph_firstActvity"
    android:name="io.androidedu.FirstActivity"
    android:label="First Activity">

    <action
        android:id="@+id/nav_graph_actFirstActvity"
        app:destination="@id/nav_graph_secondActvity" />
</activity>

<activity
    android:id="@+id/nav_graph_secondActvity"
    android:name="io.androidedu.SecondActivity"
    android:label="Second Activity" />

之后我找不到多个活动的样本in here. 有一些样本:

Navigation.findNavController(view).navigate(R.id.nav_graph_actFirstActvity)

但findNavController()等待视图,而不是活动。

我怎样才能解决这个问题呢?

3 个答案:

答案 0 :(得分:3)

导航旨在帮助片段导航,正如他们在蓝色here注释中提到的那样

  

注意:导航体系结构组件是为具有一项主要活动和多个片段目标的应用而设计的。主要活动“托管”导航图。在具有多个活动目标的应用程序中,每个其他活动均承载其自己的导航图。在本文档的后面部分将讨论修改活动以托管导航。

因此,您可以做的是将Activity用作nav_graph1.xml中的目标,并且该Activity(目标)必须具有自己的nav_graph2.xml。 这样,您就可以继续使用导航来浏览应用程序。

使用多个共享相同布局的Activity时,您提到的google文档确实是这样,这有点令人困惑。但是我认为它们的意思是您可以将Activity1和Fragment1(nav_graph1.xml)和Activity2和Fragment2(nav_graph2.xml)合并到Activity3和(Fragment1和Fragment2),因为它们共享相同的布局,并且可以使用nav_graph指向nav_graph2.xml的.xml

希望有帮助

更新:

Navigation.findNavController(view).navigate(R.id.nav_graph_actFirstActvity)

该视图可以是包含NavHostFragment的布局内的任何视图。它将搜索与该视图或其所有父视图相对应的nav_graph.xml。

答案 1 :(得分:0)

不要将多个活动放在一个导航xml文件中。导航旨在解决活动中导航,这意味着它只能优雅地支持片段。要开始另一项活动,只需按照context.startActivity(intent)这样的旧方式进行。您可以在此google示例中找到更多详细信息:

https://github.com/googlesamples/android-sunflower

答案 2 :(得分:-1)

我发现使用操作导航到活动会给您带来错误:

IllegalArgumentException: navigation destination xxx is unknown to this NavController

您可以使用以下路线:

    findNavController().navigate(directions)