首页 > 解决方案 > 如何将警报对话框或弹出窗口中的事件/值传递给 Android MVP 中的活动?

问题描述

我正在为我的应用程序遵循 MVP 模式,我对将事件侦听器添加到警报对话框以及将文本视图值从警报对话框传递回活动感到困惑。哪个是最好的方法?在此处输入图像描述

标签: androidkotlinandroid-mvp

解决方案


使用Listener是最好的方法。如何?让我们看看-

我假设您正在使用自定义对话框,为此应用这些步骤以获得正确的回调-

  1. 在您的CustomDialog类中创建一个接口,它将返回回调事件。
  2. 在Presenter/ViewModel类中实现该接口。
  3. 现在您的Presenter/ViewModel覆盖该回调方法,然后您可以将其用于下一个任务。
  4. 将Presenter/ViewModel引用作为接口的实例传递给您的自定义对话框。
  5. 现在在对话框中调用所需的接口方法。

快速代码示例(在 kotlin 中)

自定义对话框

    class CustomDialog : DialogFragment() {

    var listener: Listener? = null
    var messageText = ""

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(this.activity)
        val rootView = activity?.layoutInflater?.inflate(R.layout.dialog_custom, null)
        isCancelable = false
        val messageTextView: TextView? = rootView?.findViewById(R.id.messageTextView)
        val okButton: Button? = rootView?.findViewById(R.id.okButton)

        if (messageText.isNotBlank()) {
            messageTextView?.text = messageText
        }

        okButton?.setOnClickListener {
            listener?.customOkClicked()
            dismiss()
        }

        builder.setView(rootView)
        return builder.create()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE)
        dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

        return super.onCreateView(inflater, container, savedInstanceState)
    }

    interface Listener {
        fun customOkClicked()
    }
}

YouPresenter

class MyPresenter: CustomDialog.Listener {

    .
    .
    // other code

    override fun customOkClicked() {
        // your next step
    }
 }

你的活动

class YourActivity: Activity() {

  .
  .

  fun showCustomDialog() {
     CustomDialog().apply {
            this.listener = presenter  // reference of your presenter class. 
            this.messageText = msg
        }.show(supportFragmentManager, "custom_dialog_tag")
  }

}

注意:您可以对MVVM应用相同的方法,以防万一,对您的ViewModel执行相同的操作。

希望这是您正在寻找的答案。


推荐阅读