我想在片段A的顶部添加片段B而不会看到片段A被破坏的视图。我在导航库中看到的唯一选项是使用导航方法打开片段但是如何确保片段B添加在片段A的顶部,而不是替换。
navigationController.navigate(R.id.B, bundle);
以及如何找到片段A的实例以便能够与它进行交互?
想知道以便澄清自己。当您导航到片段B时,为什么不希望片段A被销毁?
猜猜你是否不想要松散片段A的状态,你可以在viewModel中初始化它并在你的活动的onCreate中检索它(你的片段的生命周期方法确定听起来合适)。如果这不是原因,请务必解释为我们提供更好的背景。
用于导航库将片段交换出容器的方式。 here's a brief summary of the navigation library
As per the docs(我建议你应该阅读,因为这是一个漫长的过程,有很多模糊的词。
假设您至少使用Android Studio 3.3或更高版本,
1- add navigation library to project.
dependencies {
def nav_version = "2.0.0"
implementation "androidx.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
implementation "androidx.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
}
2 - 创建导航图。
要向项目添加导航图,请执行以下操作:
在“项目”窗口中,右键单击res目录,然后选择“新建”>“Android资源文件”。
出现“新建资源文件”对话框。在“文件名”字段中键入名称,例如“nav_graph”。
从“资源类型”下拉列表中选择“导航”,然后单击“确定”。
3- Add a navhost to an activity
在父活动的xml视图中,您希望进行交换。在这种情况下,视图构成您希望在其中交换的容器视图的活动,添加以下带有相应导航图名称的代码段。
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:defaultNavHost="true"
app:navGraph="@navigation/my_navigation_graph_file_name" />
不是将defaultNavHost属性设置为true,以向导航库指示它应该以直观的方式接管后退按钮和向上按钮的处理,以便在应用程序内正确导航。
6- Add destinations to the graph.
向导航图添加目的地有三种不同的方法。您可以从现有片段(已在问题上下文中交换的片段)或活动创建目标,创建新目标,或创建占位符以便稍后用片段或活动替换。
要使用导航编辑器添加新目标类型,请执行以下操作:
在导航编辑器中,单击“新建目标”图标,然后单击“创建新目标”。
在出现的“新建Android组件”对话框中,创建片段。有关片段的更多信息,请参阅片段文档。
7 Designate a destination as the start destination
完成所有目的地后,您可以通过执行以下操作选择起始目的地:
在“设计”选项卡中,单击目标以突出显示它。
右键单击目标,然后单击“设置为起始目标”。
“类型”字段包含“操作”。 ID字段包含操作的ID。 Destination字段包含目标片段或活动的ID。
单击“文本”选项卡以切换到XML视图。现在,操作元素已添加到源目标。该操作具有ID和目标属性,其中包含下一个目标的ID,如下图所示:
使用NavController(一个管理NavHost中的应用程序导航的对象)导航到目的地。每个NavHost都有自己的相应NavController。
要检索片段,活动或视图的NavController,请使用以下方法之一:
NavHostFragment.findNavController(Fragment)
Navigation.findNavController(Activity, @IdRes int viewId)
Navigation.findNavController(View)
检索NavController后,使用其navigate()方法导航到目标。 navigate()方法接受操作或目标的资源ID。
button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment_destination_name, null));
以及导航库为我们提供Android开发的更多精彩内容。避免使答案非常冗长,这就是为什么我没有包括所有内容。建议您检查导航库和android体系结构组件的官方文档整体。希望这可以帮助。