Фрагмент диалога не может передать события назад вызову фрагмента в Android? - PullRequest
0 голосов
/ 16 июня 2019

В моем 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 коде.

1 Ответ

1 голос
/ 16 июня 2019

в вашем 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...