导航架构组件 - 活动
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.
所以,我的问题是:
即使我有一个可以用 Activity
实现的非常简单的屏幕,为了使用这个新的导航系统,也需要托管 Fragment
包含实际视图?
Activity
会在不久的将来实现 NavHost
接口吗?
--更新--
根据 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.
- 使用
ActivityNavigator
代替 startActivity
有什么好处吗?
- 使用导航组件时退出活动的正确方法是什么?
导航图仅存在于单个 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)
我一直在关注 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.
所以,我的问题是:
即使我有一个可以用
Activity
实现的非常简单的屏幕,为了使用这个新的导航系统,也需要托管Fragment
包含实际视图?Activity
会在不久的将来实现NavHost
接口吗?
--更新--
根据 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.
- 使用
ActivityNavigator
代替startActivity
有什么好处吗? - 使用导航组件时退出活动的正确方法是什么?
导航图仅存在于单个 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)