想知道以便澄清自己。为什么在导航到片段 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-创建导航图。
要将导航图添加到您的项目,请执行以下操作:
在 Project 窗口中,右键单击 res 目录并选择 New > Android Resource File。
出现新建资源文件对话框。
在文件名字段中输入名称,例如“nav_graph”。
从资源类型下拉列表中选择导航,然后单击确定。
3-Add a navhost to an activity
在您希望进行交换的父活动的 xml 视图中。在这种情况下,其视图构成您希望在其中交换的容器视图的活动,添加以下代码 sn-p 和适当的导航图名称。
<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.
可以通过三种不同的方式将目的地添加到您的导航图中。您可以从现有片段(您已经在问题上下文中交换的片段)或活动创建目的地,创建新目的地,或创建占位符以稍后替换为片段或活动。
要使用导航编辑器添加新的目的地类型,请执行以下操作:
在导航编辑器中,单击新建目的地图标 ,然后单击创建新目的地。
在出现的 New Android Component 对话框中,创建您的 Fragment。有关片段的更多信息,请参阅片段文档。
7-Designate a destination as the start destination
所有目的地都准备好后,您可以通过执行以下操作来选择起始目的地:
在“设计”选项卡中,单击目标以突出显示它。
右键单击目的地,然后单击设置为起始目的地。
8-Connect destinations
在“设计”选项卡中,将鼠标悬停在您希望用户从中导航的目标的右侧。目的地右侧会出现一个圆圈。
单击并将光标拖到您希望用户导航到的目标上,然后松开。两个目的地之间的结果线代表一个动作。
单击箭头以突出显示该操作。以下属性出现在“属性”面板中:
类型字段包含“操作”。
ID 字段包含操作的 ID。
Destination 字段包含目标片段或活动的 ID。
单击文本选项卡以切换到 XML 视图。现在将一个操作元素添加到源目标。该操作有一个 ID 和一个包含下一个目的地 ID 的目的地属性,如下图所示:
9-Navigate to a destination
导航到目的地是使用 NavController 完成的,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 架构组件的整体情况。希望这会有所帮助。