В моем Android-приложении активность в области навигации отображается как MainActivity
.
И я не намерен выполнять какие-либо задачи в MainActivity
, кроме навигации, я хочу, чтобы все было просто и я использовал Fragments
для своих задач.
Итак, у меня есть Fragment
, который вызывает 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
коде.