找不到实现监听器的Fragment

问题描述 投票:0回答:1

我一直在尝试从片段 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

android kotlin android-fragments interface callback
1个回答
0
投票

如果您想从

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()

    }

© www.soinside.com 2019 - 2024. All rights reserved.