You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法找到实现Listener的Fragment:FragmentB调用FragmentA回调失败

在Navigation组件的单Activity多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:57:44