我一直在尝试从片段 B 调用片段 A 的回调,但当我调用片段 B 的 onAttach 时,我似乎可以找到合适的片段 A。
更具体地说,片段 A 文件:
class FragmentA : Fragment(), MyAdapterClickListener, FragmentB.CallBListener {
override fun testFunFromFragmentB(myVarA: String) { someFun(myVarA) }
[...]
// This is how I setup the navigation to FragmentB
override fun MyAdapterClick(myVarB: Parcel) {
val action = FragmentDirections.actionFragmentAToFragmentB(myVarB)
Navigation.findNavController(requireView()).navigate(action)
}
在片段B文件中:
class FragmentB : Fragment() {
interface CallBListener {
fun testFunFromFragmentB(myVarA: String)
}
private var myListener: CallBListener? = null
override fun onAttach(context: Context) {
super.onAttach(context)
myListener = findListener()
if (myListener == null) {
throw RuntimeException("$context must implement CallBListener")
}
}
private fun findListener(): CallBListener? {
val fragmentManager = parentFragmentManager
// Traverse the fragment stack to find the fragment that implements CallBListener
for (fragment in fragmentManager.fragments) {
if (fragment is CallBListener) {
return fragment
}
}
// Return null if no fragment implements CallBListener
return null
}
我尝试了
findListener
的不同变体,但我似乎找不到FragmentA。
如何从 FragmentB 调用 FragmentA 的
someFun
?
如果您想从
FragmentB
调用 FragmentA
中的某些内容,则无需设置侦听器。您可以使用 FragmentA
之类的方法获取 parentFragmentManager
的实例,然后调用您想要调用的函数。这避免了设置侦听器的额外复杂性。
override fun onAttach(context: Context) {
super.onAttach(context)
//Find fragment by Id
val fragmentA =
parentFragmentManager.findFragmentById(R.id.fragmentA_container) as? FragmentA
//Call the function you need
fragmentA?.someFun()
}