Android Kotlin:未调用接口覆盖函数

Android Kotlin: Interface override function not being called

我有 FragmentA 和 FragmentB。 我正在尝试从 FragmentB

更新 FragmentA 的值

我有一个接口:

interface FragmentCallback {
    fun onDataSent(sendUpdatedData: String, position: Int?)
}

在FragmentA中,我覆盖了接口函数。我还实例化了 FragmentB 并调用了 setFragmentCallback 函数

class FragmentA: Fragment(), FragmentCallback {

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        FragmentB().setFragmentCallback(this)
    }

    //This function is not being called from FragmentB...
    override fun onDataSent(sendUpdatedData: String, position: Int?) {
            updateRecyclerView(sendUpdatedData, position!!)
    }

在 FragmentB(位于 FragmentA 之上)中,我实例化了 FragmentCallback 接口。当我完成编辑并弹出片段(backstack)时,我从 FragmentA(onDataSent) 调用覆盖函数。

class FragmentB: Fragment(){
    private var fragmentCallback: FragmentCallback? = null

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
    
        btn_save.setOnClickListener{
            fragmentCallback?.onDataSent(et_new_text.text.toString(), position )
            fragmentManager?.popBackStack()
        }
    }

    fun setFragmentCallback(callback: FragmentCallback?) {
        fragmentCallback = callback
    }
}

出于某种原因,当我弹出 FragmentB 并通过以下行调用 onDataSent 时:

fragmentCallback?.onDataSent(et_new_text.text.toString(), position)

onDataSent 实际上不会被调用。

你也可以试试这个。

让您的 activity 实现您的界面。

class YourActivity : FragmentCallback{
    override fun onDataSent(sendUpdatedData: String, position: Int?) {
       // Get Fragment A
       val fraga: FragmentA? = 
              supportFragmentManager.findFragmentById(R.id.fragment_a) as FragmentA?
            fraga.updateRecyclerView(sendUpdatedData,position)
          }
}

在你的fragmentB中,像这样发送数据。

class FragmentB : Fragment() {
    var mCallback: FragmentCallback? = null

    override fun onAttach(activity: Activity) {
        super.onAttach(activity)

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        mCallback = try {
            activity as FragmentCallback
        } catch (e: ClassCastException) {
            throw ClassCastException(
                activity.toString()
                        + " must implement TextClicked"
            )
        }
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        mCallback.onDataSent(et_new_text.text.toString(), position)
        fragmentManager?.popBackStack()
    }
    
    override fun onDetach() {
        mCallback = null // => avoid leaking, thanks @Deepscorn
        super.onDetach()
    }
}

在你的 FragmentA 中。

class FragmentA : Fragment() {
    fun updateRecyclerView(sendUpdatedData: String, position: Int?) {
        // Here you'll have it
    }
}

FragmentA中使用FragmentResultListener:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setFragmentResultListener("requestKey") { key, bundle ->
        val sendUpdatedData = bundle.getString("sendUpdatedData")
        // Do something with the result...
    }
}

然后在FragmentB设置结果:

btn_save.setOnClickListener{
    val result = et_new_text.text.toString()
    setFragmentResult("requestKey", bundleOf("sendUpdatedData" to result))
    ...
}

看看official documentation

old-fashioned way uses the Activity to communicate between two fragments. You could also use a shared ViewModel 共享数据。