导航架构组件 - 活动

时间:2018-05-21 15:47:10

标签: android android-architecture-navigation

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

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

  

NavHost是一个空视图,其中目的地被交换进来   在用户浏览您的应用时输出。

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

  

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

所以,我的问题是:

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

  • Activity会在不久的将来实施NavHost界面吗?

- 更新 -

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

  

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

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

3 个答案:

答案 0 :(得分:20)

导航图仅存在于单个活动中。根据{{​​3}},<activity>目的地可以用来从导航图中启动一个活动,但是一旦第二个活动开始,它就完全独立于原始导航图(它可能有它的自己的图表或只是一个简单的活动。)

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

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

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

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

答案 1 :(得分:2)

我设法通过使用ActivityNavigator从一个活动导航到另一个活动,而没有托管片段。

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

答案 2 :(得分:2)

我还设法通过使用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)