使用片段导航(导航图)导航时调用目标片段的 function/method
Call function/method of the target fragment when navigated using Fragment Navigation (nav graph)
目前我的应用有一个 activity 和两个片段,一个是 HomeFragment
,另一个是 SearchFragment
。我正在使用 Fragment Navigation 在 Fragment 之间导航。
在 SearchFragment
中,我要求用户提供 he/she 想要搜索的值。完成后,我希望该应用导航回 HomeFragment
并执行搜索。为此,我创建了一个接口并在 SearchFragment
中构建了一个名为 addListener()
的方法来设置该侦听器。
不要从 HomeFragment 导航到 SearchFragment 我正在使用以下行:
findNavController().navigate(R.id.action_home_to_search_fragment, bundle)
这让我无法选择调用 SearchFragment 的方法,因为我没有它的实例。这里有人可以帮我解决这个问题吗?
如何获取实例或调用方法,这将是一个很大的帮助。
谢谢
您可以使用 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
})
由于您使用的是导航库,因此可以将查询作为参数传递给 HomeFragment
。为此,将参数添加到导航图中的 HomeFragment
,默认值为 null
。在 HomeFragment
中使用该查询参数来显示适当的数据。
在 SearchFragment
中,当用户键入查询并点击搜索时,您可以前进到 [,而不是通过 navigateUp()
或 popBackStack()
返回到 HomeFragment
=10=] 通过一个动作。在从 SearchFragment
到 HomeFragment
的过程中,请记住先将这两个从返回堆栈中弹出(为此在导航图中使用 popUpTo
属性),这样您就只有 HomeFragment
在最后的返回堆栈中。
另一种方法: 可能更直接的方法是使用片段结果 API 将数据从一个片段发送到另一个片段。可以参考docs了解用法。
您还可以包含 Navigation Safe Args
。
然后在 nav_graph 中执行从 SearchFragment
到 HomeFragment
的操作,
并且还在 nav_graph
中为 HomeFragment
设置一个参数,类型为字符串和默认值 null
或者只是 ""
.
然后在 SearchFragment
中的发送命令中写入以下内容:
val action = SearchFragmentDirection.actionSearchFragmentToHomeFragment(EditText.text.toSrting)
findNavController.navigate(action)
您接受 HomeFragment
中的数据,为此您在全球范围内创建
你的 HomeFragmentArgs 的一个实例:
private val args: HomeFragmentArgs by navArgs()
并将逻辑从 SearchFragment 转移到 HomeFragment
并插入这个参数
并将此参数 (args) 粘贴到您发出请求或调用的地方
您可以在此处了解有关安全参数的更多信息:https://developer.android.com/guide/navigation/navigation-pass-data
目前我的应用有一个 activity 和两个片段,一个是 HomeFragment
,另一个是 SearchFragment
。我正在使用 Fragment Navigation 在 Fragment 之间导航。
在 SearchFragment
中,我要求用户提供 he/she 想要搜索的值。完成后,我希望该应用导航回 HomeFragment
并执行搜索。为此,我创建了一个接口并在 SearchFragment
中构建了一个名为 addListener()
的方法来设置该侦听器。
不要从 HomeFragment 导航到 SearchFragment 我正在使用以下行:
findNavController().navigate(R.id.action_home_to_search_fragment, bundle)
这让我无法选择调用 SearchFragment 的方法,因为我没有它的实例。这里有人可以帮我解决这个问题吗?
如何获取实例或调用方法,这将是一个很大的帮助。
谢谢
您可以使用 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
})
由于您使用的是导航库,因此可以将查询作为参数传递给 HomeFragment
。为此,将参数添加到导航图中的 HomeFragment
,默认值为 null
。在 HomeFragment
中使用该查询参数来显示适当的数据。
在 SearchFragment
中,当用户键入查询并点击搜索时,您可以前进到 [,而不是通过 navigateUp()
或 popBackStack()
返回到 HomeFragment
=10=] 通过一个动作。在从 SearchFragment
到 HomeFragment
的过程中,请记住先将这两个从返回堆栈中弹出(为此在导航图中使用 popUpTo
属性),这样您就只有 HomeFragment
在最后的返回堆栈中。
另一种方法: 可能更直接的方法是使用片段结果 API 将数据从一个片段发送到另一个片段。可以参考docs了解用法。
您还可以包含 Navigation Safe Args
。
然后在 nav_graph 中执行从 SearchFragment
到 HomeFragment
的操作,
并且还在 nav_graph
中为 HomeFragment
设置一个参数,类型为字符串和默认值 null
或者只是 ""
.
然后在 SearchFragment
中的发送命令中写入以下内容:
val action = SearchFragmentDirection.actionSearchFragmentToHomeFragment(EditText.text.toSrting)
findNavController.navigate(action)
您接受 HomeFragment
中的数据,为此您在全球范围内创建
你的 HomeFragmentArgs 的一个实例:
private val args: HomeFragmentArgs by navArgs()
并将逻辑从 SearchFragment 转移到 HomeFragment 并插入这个参数
并将此参数 (args) 粘贴到您发出请求或调用的地方
您可以在此处了解有关安全参数的更多信息:https://developer.android.com/guide/navigation/navigation-pass-data