【问题标题】:how to handle Dialog Clicks in fragment如何处理片段中的对话框点击
【发布时间】:2023-04-06 09:29:01
【问题描述】:

如何处理对话框片段中的按钮点击。单击对话框按钮后,我想在片段中运行方法,开发文档中给出的示例适用于活动,但不适用于片段。

我的警报对话框

class MyAlertDialog : DialogFragment() {
    
    var listener: MyListener

    interface MyListener {
        onPositiveClick(dialog: DialogFragment)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        try {
            listener = context as MyListener
        } catch (e: ClassCastException) {

            throw ClassCastException((context.toString() + " must implement MyDailogListener")
        }
    }

    override fun onCreateDialog(savedInstanceState:Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it)
            builder.setMessage("Do you want to reset the score.")
                .setPositiveButton("Confirm",
                    DialogInterface.OnClickListener { dialog, id ->
                        ...
                    })
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

我的片段

class MyFragment : Fragment(), MyAlertDialog.MyListener {

    ...

    fun launchAlertDialog() {
        val dailog = MyAlertDialog().also {
            it.show(requireActivity().supportFragmentManager, "DialogInfoFragment")
        } 
    }

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

【问题讨论】:

  • 这是正确的可编译代码吗?我问是因为您在任何地方都有不同的侦听器类型名称。 MyDialogListener, MyAlertDialogListener , MyListener
  • @dinkar_kumar 谢谢,我在网上的一个例子和我正在练习的例子之间来回切换。

标签: android android-dialog


【解决方案1】:

DialogFragment 是从 Activity 而不是从 Fragment 启动的,尽管在 Fragment 中被调用。仅当您连接到活动时,以这种方式链接界面才有效。

如果你只是更新数据,你可以通过构造函数将 ViewModel 传递给 DialogFragment。

片段

fun launchAlertDialog() {
    val fragment = MyFragment(viewModel)
    fragment.show(requireActivity().supportFragmentManager, "MyAlertDialog")
}

对话框片段

class MyAlertDialog(val viewModel: MainViewModel) : DialogFragment() {
    overrideOnCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it)
            builder.setMessage(...)
                .setPositiveButton("My Text", DialogInterface.OnClickListener { dialog, id -> 
                    viewModel.updateMyData()
                })
            builder.create()
        } 
    } ?: throw IllegalStateException("Activity cannot be null")

}

您也可以在此处使用这种方法在 Fragment 中运行函数。 https://stackoverflow.com/a/65116644/3943340

请记住,从 API 28 开始,setTargetFragment 现已弃用(API 上可能有误)。

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多