使用片段导航(导航图)导航时调用目标片段的函数/方法
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
。在从SearchFragment
到HomeFragment
时,请记住先将这两个从后台堆栈中弹出(为此在导航图中使用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 中执行从SearchFragment
到HomeFragment
的操作,
并在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 导航组件