我一直在关注Navigation Architecture Component的文档,以了解这个新导航系统的工作原理。
要从一个屏幕转到另一个屏幕,您需要一个实现NavHost
接口的组件。
NavHost是一个空视图,其中目的地被交换进来 在用户浏览您的应用时输出。
但是,目前似乎只有Fragments实现了NavHost
Navigation Architecture Component的默认NavHost实现是NavHostFragment。
所以,我的问题是:
即使我有一个可以用Activity
实现的非常简单的屏幕,为了使用这个新的导航系统,需要托管Fragment
包含实际视图
Activity
会在不久的将来实施NavHost
界面吗?
- 更新 -
根据ianhanniballake的回答,我了解每个活动都包含自己的导航图。但是如果我想使用导航组件从一个活动转到另一个活动(替换"旧" startActivity
调用),我可以使用activity destinations
。 activity destinations
对我来说并不清楚,因为docs for migration没有详细说明:
然后可以通过向导航图添加活动目标来链接单独的活动,在整个代码库中替换startActivity()的现有用法。
ActivityNavigator
代替startActivity
有什么好处? 答案 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)