gpt4 book ai didi

android - 使用导航架构组件时如何与其他 fragment 交互?

转载 作者:行者123 更新时间:2023-11-30 05:10:43 25 4
gpt4 key购买 nike

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

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


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

最佳答案

想要知道以便澄清自己。当导航到片段B时,为什么不希望片段A被破坏?

猜猜是否不想释放片段A的状态,可以在viewModel中对其进行初始化,然后在其活动的onCreate(无论您确定片段的哪种生命周期方法都适合)中进行检索。如果不是这个原因,plz会解释为我们提供更好的环境。

对于导航库,将片段交换出容器的方式。
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

一旦所有目的地都准备就绪,您可以通过执行以下操作选择开始目的地:

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

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

8- Connect destinations


在“设计”选项卡中,将鼠标悬停在您要用户导航的目标的右侧。目的地右侧上方会出现一个圆圈。
单击光标并将其拖动到要用户导航并释放的目标上。两个目标之间的结果线代表一个动作。
单击箭头以突出显示操作。以下属性出现在“属性”面板中:


类型字段包含“操作”。
ID字段包含操作的ID。
目标字段包含目标片段或活动的ID。

单击文本选项卡以切换到XML视图。现在将动作元素添加到源目标。该操作具有一个ID和一个目标属性,该属性包含下一个目标的ID,如下图所示: enter image description here

9- Navigate to a destination

使用NavController(可在NavHost中管理应用程序导航的对象)可以导航到目的地。每个NavHost都有自己的对应NavController。

要获取片段,活动或视图的NavController,请使用以下方法之一:

NavHostFragment.findNavController(Fragment)

Navigation.findNavController(Activity, @IdRes int viewId)

Navigation.findNavController(View)


检索NavController后,请使用其Navigation()方法导航到目标位置。 navigation()方法接受操作或目标的资源ID。

button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment_destination_name, null));


导航库必须为我们提供更多精彩的东西,以便我们为Android开发者提供服务。避免冗长的答案,这就是为什么我没有包含所有内容的原因。建议您整体查看导航库和android体系结构组件的官方文档。希望这可以帮助。

关于android - 使用导航架构组件时如何与其他 fragment 交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53803598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com