Dialog Fragment 无法将事件传回 Android 中的调用 Fragment?

Dialog Fragment can't pass back events to calling Fragment in Android?

在我的 Android 应用程序中,我将导航抽屉 activity 作为 MainActivity。 我不打算在 MainActivity 中执行导航以外的任何任务,我想保持简单并使用 Fragments 来完成我的任务。

所以我有一个 Fragment,它调用 DialogFragmentDialogFragment 将事件传回给 Fragment。我的实现类似于 docs.

中给出的代码

但是,当需要显示对话框时,我的应用程序崩溃了。

这是我的 DialogFragment:

class DialogSubjectsProgress: DialogFragment() {
    internal lateinit var listener: TheDialogListener

    interface TheDialogListener {
        fun onDialogCancel(dialog: DialogFragment)
        fun onDialogDismiss(dialog: DialogFragment)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as TheDialogListener
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        super.onCreateDialog(savedInstanceState)

        // show progress dialog
        val progressView = activity!!.layoutInflater.inflate(R.layout.dialog_progress_i, null)
        progressView.findViewById<TextView>(R.id.progress_message).text = "Fetching data"

        return activity!!.let {
            val progressBuilder = AlertDialog.Builder(it, R.style.ThemeOverlay_AppCompat_Dialog)
            progressBuilder
                .setView(progressView)
                .setOnCancelListener {
                    listener.onDialogCancel(this)
                }
                .setOnDismissListener {
                    listener.onDialogDismiss(this)
                }
                .create()
        }
    }
}

这是我的 Fragment 代码,根据文档,它用于 Activity:

class FragmentSubjects: Fragment(), DialogSubjectsProgress.TheDialogListener {

    // other code

    private fun addSubject() {
        // show progress dialog
        val progressDialog = DialogSubjectsProgress()
        progressDialog.show(activity!!.supportFragmentManager, "null")

        // todo
        // progressDialog.dismiss()

    }

    override fun onDialogCancel(dialog: DialogFragment) {
        // User canceled the dialog
    }

    override fun onDialogDismiss(dialog: DialogFragment) {
        // Dialog's work is done
        // todo
    }

}

我找到了这个here的解决方法,但是我不太明白,因为它是用Java写的,我不明白Java。我需要 Kotlin 的帮助!!

----编辑----

这是log:

java.lang.ClassCastException: com.example.kotlinappv3.MainActivity cannot be cast to com.example.kotlinappv3.DialogSubjectsProgress$TheDialogListener
        at com.example.kotlinappv3.DialogSubjectsProgress.onAttach(DialogSubjectsProgress.kt:27)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1404)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:874)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:198)
        at android.app.ActivityThread.main(ActivityThread.java:6729)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

at com.example.kotlinappv3.DialogSubjectsProgress.onAttach(DialogSubjectsProgress.kt:27)

指向

listener = context as TheDialogListener

在我的 DialogFragment 代码中。

在您的 addSubject 方法中而不是

activity!!.supportFragmentManager

使用:

childFragmentManager

并在 DialogFragment 代码中,更改:

override fun onAttach(context: Context) {
    super.onAttach(context)
    listener = context as TheDialogListener
}

至:

override fun onAttachFragment(childFragment: Fragment?) {
    super.onAttachFragment(childFragment)
    listener = context as TheDialogListener
}