android - Dialog Fragment 不能将事件传回给 Android 中的 Fragment 调用?
问题描述
在我的 Android 应用程序中,我将导航抽屉活动作为MainActivity
. 除了导航之外,我不打算做任何任务MainActivity
,我想保持简单并Fragments
用于我的任务。
所以我有一个Fragment
调用 a 的DialogFragment
,DialogFragment
将事件传回给Fragment
. 我的实现类似于文档中给出的代码。
但是,当需要出现对话框时,我的应用程序崩溃了。
这是我的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
}
}
我在这里找到了解决方案,但我不是很明白,因为它是用 写的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$1.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
}
推荐阅读
- c++ - 为进程的 boost::asio 线程设置更高的优先级
- android - 如何在循环中从 Spinner 获取所有值
- django - 如何找到 FK 对象的名称及其计数?
- reactjs - Material DateTimePicker onChange Typescript 不匹配错误
- r - R中两次之间的差异
- powershell - 使用 PowerShell 复制事件查看器日志并在成功复制时将其删除
- react-native - 用一种字体包裹整个 React Native 应用程序
- python - Python time_ns 时间差在 1 毫秒 (10^6 ns) 以下时为 0
- marathontesting - 马拉松 | JNLP 应用程序上的 Java 驱动程序 - 没有可用的顶级窗口
- javascript - jQuery Select Nested List - 目标同级列表项