【问题标题】:AlertDialog Listener not attached未附加 AlertDialog 侦听器
【发布时间】:2020-12-02 21:41:32
【问题描述】:

MyAlertDialog 在尝试为侦听器设置上下文时抛出 ClassCastException。我正在从片段中调用 MyAlertDailog。

我正在使用 android 开发文档中的指南。

https://developer.android.com/guide/topics/ui/dialogs#PassingEvents

我的片段

class MyFragment : Fragment(), MyAlerDialog.MyAlertDialogListener {

    ...

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

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

我的警报对话框

class MyAlertDialog : DialogFragment() {
    
    // Use thsi instance for the interface
    internal var listener: MyAlertDialogListener

    // My Fragment implements this interface. 
    interface MyAlertDialogListener {
        onDialogPositiveClick(dialog: DialogFragment)
    }

   
    override fun onAttach(context: Context) {
        super.onAttach(context)
        // Verify  that the host implements the callback. 
        try {
            // My problem is here. 
            listener = context as MyAlertDailog
        } catch (e: ClassCastException) {
            // exception thrown here. 
            throw ClassCastException((context.toString() + " must implement MyAlertDailogListener")
        }
    }

    override fun onCreateDialog(savedInstanceState:Bundle?): Dialog {
        return activity?.let {
             val builder = AlertDialog.builder(it)
             ...
             builder.setPosiviveButton("Positive button",
               DialogInterface.OnClickListener {
                   listener.onDialogPositiveClick(this)     
             }
        }
    }

}

错误报告

    java.lang.ClassCastException: com.example.androiddevpractice.MainActivity@ab56136 must implement MyAlertDialogListener
        at com.example.androiddevpractice.topics.userinterface.dialog.MyAlertDialog.onAttach(MyAlertDialog.kt:35)

【问题讨论】:

    标签: kotlin android-alertdialog


    【解决方案1】:

    尽管launchAlertDialog() 方法在MyFragment 内部,但MyAlertDialog 的“主机”是您的Activity,而不是MyFragment

    MainActivity 内部实现MyAlerDialog.MyAlertDialogListener 以使转换成功。如果需要,MainActivity 然后可以与MyFragment 通信。


    或者,您可以使用setTargetFragment() 直接“连接” MyFragment 和 MyAlertDialog:

    val dialog = MyAlertDialog()
    dialog.setTargetFragment(this, 0)
    dialog.show(requireActivity().supportFragmentManager, "DialogInfoFragment")
    

    然后,您将转换 getTargetFragment() 的结果,而不是覆盖 onAttach() 并转换上下文:

    builder.setPosiviveButton(
            "Positive button",
            DialogInterface.OnClickListener {
                val listener = targetFragment as MyAlertDialogListener
                listener.onDialogPositiveClick(this)     
            }
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2015-12-30
      • 2013-01-27
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多