首页 > 解决方案 > 使用 Navigation 架构组件时如何与其他 Fragment 交互?

问题描述

我想在片段 A 的顶部添加片段 B,而不会看到片段 A 被破坏。我在导航库中看到的唯一选项是使用导航方法打开片段,但如何确保片段 B 添加到片段 A 之上,而不是替换。

navigationController.navigate(R.id.B, bundle);

以及如何找到能够与之交互的片段 A 的实例?

标签: androidandroid-fragmentsandroid-jetpackandroid-architecture-navigation

解决方案


想知道以澄清自己。当您导航到片段 B 时,为什么不希望片段 A 被销毁?

猜猜您是否不想丢失片段 A 的状态,您可以在viewModel中初始化它并在活动的 onCreate 中检索它(您确定的片段的生命周期方法听起来合适)。如果这不是原因,请解释一下,以便为我们提供更好的上下文。

用于将片段交换出容器的导航库方式。 这里简单总结一下导航库

根据文档(我建议您阅读,因为这是一个冗长的过程,有很多模糊的单词。

假设您至少使用 Android Studio 3.3 或更高版本,

1-将导航库添加到项目中。

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-将导航主机添加到活动

在您希望进行交换的父活动的 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-将目的地添加到图表中。

可以通过三种不同的方式将目的地添加到导航图中。您可以从现有片段(您已经在问题上下文中交换的片段)或活动创建目的地,创建新目的地,或创建占位符以稍后替换为片段或活动。

要使用导航编辑器添加新的目的地类型,请执行以下操作:

在导航编辑器中,单击新目的地图标 ,然后单击创建新目的地。

在出现的 New Android Component 对话框中,创建您的片段。有关片段的更多信息,请参阅片段文档。

7-指定一个目的地作为起始目的地

准备好所有目的地后,您可以通过执行以下操作来选择起始目的地:

在“设计”选项卡中,单击目标以突出显示它。

右键单击目标,然后单击设置为起始目标。

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 架构组件的整体情况。希望这可以帮助。


推荐阅读