首页 > 解决方案 > 导航控制器 AlertDialog 点击监听器

问题描述

我正在使用 Android 的导航组件,我想知道如何从带有点击侦听器的片段设置 AlertDialog。

我的片段

fun MyFragment : Fragment(), MyAlertDailog.MyAlertDialogListener {
     ...

    override fun onDialogPostiveCLick(dialog: DialogFragment) {
        Log.i(TAG, "Listener returns a postive click")
    }

     fun launchMyAlertDialog() {
          // Here I would typically call setTargetFragment() and then show the dialog. 
          // but findnavcontroller doesn't have setTargetFragment()
         findNavController.navigate(MyFragmentDirection.actionMyFragmentToMyAlertDialog())
     }
}

我的警报对话框

class MyAlertDialog : DialogFragment() {

    ... 

    internal lateinit var listener: MyAlertDialogListener

    interface MyAlertDialogListener{
        fun onDialogPostiveCLick(dialog: DialogFragment)
    }

    override fun onCreateDialog(savdInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it) 
            builder.setMessage("My Dialog message")
                .setPositiveButton("Positive", DialogInterface.OnClickListener {
                    listener = targetFragment as MyAlertDialogListener                    
                    listener.onDialogPositiveClick(this)
                }
            ...
        }
    }
}

这当前在 MyAlertDialog 中初始化侦听器时收到空点异常。

标签: kotlinandroid-alertdialogandroid-architecture-navigation

解决方案


要使用targetFragment,您必须在评论时首先设置它,不幸的是,jetpack 导航不会为您执行此操作(因此出现空指针异常)。查看此线程以获取替代解决方案:https ://stackoverflow.com/a/50752558/12321475

我能给你的是另一种选择。如果用例就像在当前片段上方显示一个对话框一样简单,那么执行以下操作:

import androidx.appcompat.app.AlertDialog
...

class MyFragment : Fragment() {
     ...

    fun onDialogPostiveCLick() {
        Log.i(TAG, "Listener returns a postive click")
    }

     fun launchMyAlertDialog() {
          AlertDialog.Builder(activity)
            .setMessage("My Dialog message")
            .setPositiveButton("Positive") { _, _ -> onDialogPostiveCLick() }
            .setCancellable(false)
            .create().show()
     }
}

推荐阅读