android - 使用 Navigation 架构组件时如何与其他 Fragment 交互?
问题描述
我想在片段 A 的顶部添加片段 B,而不会看到片段 A 被破坏。我在导航库中看到的唯一选项是使用导航方法打开片段,但如何确保片段 B 添加到片段 A 之上,而不是替换。
navigationController.navigate(R.id.B, bundle);
以及如何找到能够与之交互的片段 A 的实例?
解决方案
想知道以澄清自己。当您导航到片段 B 时,为什么不希望片段 A 被销毁?
猜猜您是否不想丢失片段 A 的状态,您可以在viewModel中初始化它并在活动的 onCreate 中检索它(您确定的片段的生命周期方法听起来合适)。如果这不是原因,请解释一下,以便为我们提供更好的上下文。
用于将片段交换出容器的导航库方式。 这里简单总结一下导航库
根据文档(我建议您阅读,因为这是一个冗长的过程,有很多模糊的单词。
假设您至少使用 Android Studio 3.3 或更高版本,
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”。
从资源类型下拉列表中选择导航,然后单击确定。
在您希望进行交换的父活动的 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 以向导航库指示它应该接管后退按钮和向上按钮的处理,以便以直观的方式在应用程序中正确导航。
可以通过三种不同的方式将目的地添加到导航图中。您可以从现有片段(您已经在问题上下文中交换的片段)或活动创建目的地,创建新目的地,或创建占位符以稍后替换为片段或活动。
要使用导航编辑器添加新的目的地类型,请执行以下操作:
在导航编辑器中,单击新目的地图标 ,然后单击创建新目的地。
在出现的 New Android Component 对话框中,创建您的片段。有关片段的更多信息,请参阅片段文档。
准备好所有目的地后,您可以通过执行以下操作来选择起始目的地:
在“设计”选项卡中,单击目标以突出显示它。
右键单击目标,然后单击设置为起始目标。
8-连接目的地
在“设计”选项卡中,将鼠标悬停在您希望用户从中导航的目标的右侧。目的地右侧出现一个圆圈。
单击并将光标拖到您希望用户导航到的目的地上,然后释放。两个目的地之间的结果线代表一个动作。
单击箭头以突出显示该操作。以下属性出现在“属性”面板中:
类型字段包含“操作”。ID 字段包含操作的 ID。Destination 字段包含目标片段或活动的 ID。
单击文本选项卡以切换到 XML 视图。现在将一个操作元素添加到源目标。该操作有一个 ID 和一个包含下一个目的地 ID 的目的地属性,如下图所示:
9-导航到目的地
导航到目的地是使用 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 架构组件的整体情况。希望这可以帮助。
推荐阅读
- karate - Using If condition to select data
- c++ - Main 的 Makefile 未定义参考(在 StackOverflow 上尝试过其他帖子)
- c# - Microsoft Azure Functions Nuget 包阻止 NET 库打包到 Nuget
- css - 如何在 React 组件 div 中显示背景图像?
- c# - 访问者模式在 API 中有什么好处?
- c - 如何使用指针来使用嵌入式 C 操作内存中特定寄存器的位
- java - Removing every 5th char in a string and return new String
- nginx - Nginx:获取 OAuth2 令牌
- jquery - 获取动态添加的表单字段的值返回错误的值
- sql - vb6/vba ado 在一系列日期上左连接