【问题标题】:How to interact with other fragment when using Navigation architecture component?使用 Navigation 架构组件时如何与其他 Fragment 交互?
【发布时间】:2019-03-15 08:08:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: android android-fragments android-jetpack android-architecture-navigation


    【解决方案1】:

    想知道以便澄清自己。为什么在导航到片段 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 架构组件的整体情况。希望这会有所帮助。

    【讨论】:

    • 我们可以选择将片段替换或添加到片段容器中,那么导航库添加片段的方式是什么。
    • 谢谢!这就是我正在寻找的... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多