使用片段导航(导航图)导航时调用目标片段的函数/方法

Posted

技术标签:

【中文标题】使用片段导航(导航图)导航时调用目标片段的函数/方法【英文标题】:Call function/method of the target fragment when navigated using Fragment Navigation (nav graph) 【发布时间】:2021-12-31 07:22:15 【问题描述】:

目前我的应用程序有一个带有两个片段的活动,一个是HomeFragment,另一个是SearchFragment。我正在使用 Fragment Navigation 在 Fragment 之间导航。

SearchFragment 中,我要求用户提供他/她想要搜索的值。完成后,我希望应用导航回HomeFragment 并执行搜索。为此,我创建了一个接口并在SearchFragment 中构建了一个名为addListener() 的方法来设置该侦听器。

不要从 HomeFragment 导航到 SearchFragment 我正在使用以下行:

    findNavController().navigate(R.id.action_home_to_search_fragment, bundle)

这让我没有选择调用 SearchFragment 的方法,因为我没有这样的实例。这里有人可以帮我解决这个问题吗?

如何获取实例或调用方法,会有很大帮助。

谢谢

【问题讨论】:

【参考方案1】:

由于您使用的是导航库,因此您可以将查询作为参数传递给HomeFragment。为此,在导航图中向HomeFragment 添加一个参数,默认值为null。使用HomeFragment 中的查询参数来显示相应的数据。

SearchFragment 中,当用户键入查询并点击搜索时,您可以通过操作前进到HomeFragment,而不是通过navigateUp()popBackStack() 返回HomeFragment。在从SearchFragmentHomeFragment 时,请记住先将这两个从后台堆栈中弹出(为此在导航图中使用popUpTo 属性),以便在后台堆栈中只有HomeFragment结束。

另一种方法:可能更直接的方法是使用片段结果 API 将数据从一个片段发送到另一个片段。可以参考docs了解用法。

【讨论】:

但是你不认为它会删除HomeFragment的状态吗?现在我通过手动调用onBackPressed()导航回到HomeFragment HomeFragment 中有哪些数据被称为“状态”? 这是一个包含 webview 的 web 浏览器应用程序,其中可能已经加载了一些页面 我已经编辑了答案以添加另一种方法。试试看,如果遇到任何问题,请随时发表评论。 成功了,谢谢:)【参考方案2】:

您可以使用MutableLiveData 并将数据存储在 ViewModel 或 Activity 的 LiveData 中,如下所示:

将此行添加到您的Module-level build.gradle 文件中:

dependencies 
    //...
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'

在 ViewModel 中定义变量:

val searchQuery: MutableLiveData<String> = MutableLiveData()

当用户提供值时更新数据:

viewModel.searchQuery.postValue(query)

您可以使用 homeFragment 中的值:

viewModel.searchQuery.observe(viewLifecycleOwner,  query: String ->
    // Do whatever you want with query
)

【讨论】:

【参考方案3】:

您还可以添加Navigation Safe Args。 然后在 nav_graph 中执行从SearchFragmentHomeFragment 的操作, 并在nav_graph 中为HomeFragment 设置一个参数,其类型为String,默认值为null 或只是""

然后在SearchFragment 的发送命令中编写以下内容:

val action = SearchFragmentDirection.actionSearchFragmentToHomeFragment(EditText.text.toSrting)
findNavController.navigate(action)

您接受HomeFragment 中的数据,为此您在全局范围内创建 您的 HomeFragmentArgs 的一个实例:

private val args: HomeFragmentArgs by navArgs()

并将逻辑从 SearchFragment 转移到 HomeFragment 并插入这个论点

并将此参数(args)粘贴到您发出请求或调用的位置

您可以在此处了解有关 Safe Args 的更多信息:https://developer.android.com/guide/navigation/navigation-pass-data

【讨论】:

我正在通过操作导航到SearchFragment,然后通过手动在SearchFragment 中调用onBackPressed() 以这种方式返回,不会创建HomeFragment 的新实例。

以上是关于使用片段导航(导航图)导航时调用目标片段的函数/方法的主要内容,如果未能解决你的问题,请参考以下文章

Android导航图继续api调用问题

如何保存底部导航片段的状态 - 具有单个导航图的 Android 导航组件

在片段的后按防止使用导航图调用前一个片段的 onViewCreated

使用导航从一个片段导航到另一个片段后,防止后按工作

如何将片段目标绑定到底部导航栏中的菜单项?

在片段导航抽屉中。我在 getActionBar 中遇到错误。我能知道错误的原因和错误吗