无法找到实现Listener的Fragment:FragmentB调用FragmentA回调失败
我在单Activity多Fragment的Android应用里,尝试从FragmentB调用FragmentA的回调方法,但在FragmentB的onAttach方法中始终找不到对应的FragmentA。应用采用Navigation组件实现页面跳转,同时使用ViewBindings。
FragmentA 代码:
class FragmentA : Fragment(), MyAdapterClickListener, FragmentB.CallBListener { override fun testFunFromFragmentB(myVarA: String) { someFun(myVarA) } // ... 其他代码省略 // 跳转至FragmentB的逻辑 override fun MyAdapterClick(myVarB: Parcel) { val action = FragmentDirections.actionFragmentAToFragmentB(myVarB) Navigation.findNavController(requireView()).navigate(action) } }
FragmentB 代码:
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 // 遍历Fragment栈寻找实现CallBListener的Fragment for (fragment in fragmentManager.fragments) { if (fragment is CallBListener) { return fragment } } // 未找到则返回null return null } }
解决方案
尝试过包括遍历parentFragmentManager.fragments在内的多种方法均未成功,推测是NavHostFragment的工作机制导致FragmentB运行时FragmentA未处于活跃状态。最终通过共享ViewModel解决了此类组件间通信需求,代码如下:
class MyViewModel : ViewModel() { private var _myVar = MutableLiveData<Int>().apply { value = -1 } val myVar: LiveData<Int> get() = _myVar fun incrementDoneFlag() { _myVar.value = (_myVar.value ?: 0) + 1 } }
该方案虽未解决直接查找FragmentA的问题,但共享ViewModel可满足此类组件间通信的需求。
内容的提问来源于stack exchange,提问作者user7327149
相关产品推荐
相关产品推荐

