当前位置: 首页 > 知识库问答 >
问题:

AlertDialog侦听器未连接

沈永贞
2023-03-14

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")
    }
}

MyAlertDialog

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)

共有1个答案

葛修筠
2023-03-14

即使LaunchAlertDialog()方法在MyFraank内部,MyAlertDialog的“主机”是您的活动,而不是MyFraank

实现MyAlerDialog。MyAlertDialogListener(MyAlertDialogListener)位于主活动(MainActivity)的内部,以使强制转换成功。MainActivity可以在必要时与MyFragment通信。

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

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

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

builder.setPosiviveButton(
        "Positive button",
        DialogInterface.OnClickListener {
            val listener = targetFragment as MyAlertDialogListener
            listener.onDialogPositiveClick(this)     
        }
)
 类似资料:
  • 现在当我启动基于spring的应用程序时。我在调试器中看到,我的侦听器方法注册了,但是Spring不连接到ActiveMQ队列,我可以通过查看ActiveMQ web控制台轻松地看到这一点。此外,我没有看到任何来自spring的日志输出,而JMS的东西是这样做的。 我错过什么了吗?从这里走下去最好的路是什么?当然,我也测试了从ActiveMQ的web控制台中发送消息,但是如果没有客户端连接,就没有

  • 我收到以下错误消息 JAVAsql。SQLException:Listener拒绝了连接,出现以下错误:ORA-12505,TNS:Listener当前不知道连接描述符中给出的SID 原因:甲骨文。网纳什。NetException:侦听器拒绝连接,出现以下错误:ORA-12505,TNS:侦听器当前不知道连接描述符中给出的SID 请帮我这个...

  • 我目前正在使用mail-listener5软件包来断言电子邮件地址收件箱中的电子邮件数量。 我的测试框架是nightwatchjs。 目前,我的命令脚本从电子邮件地址收件箱(标题为getInboxEmails)中获取电子邮件的数量; 我的nightwatchjs测试脚本如下所示; 当我运行这个nightwatchjs脚本时,输出以下内容; 但是,浏览器不会关闭。 我有点期待这一点,因为在我的get

  • 我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?

  • 问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。

  • 我正在使用Realex Payments的HPP API开发一个卡支付页面,其中包含一个iFrame,用于托管Realex页面。在Realex请求表单上,我将字段HPP_POST_维度和HPP_POST_响应设置为我的URL,如下所示: 付款页: www.example.com/account/payment.html 隐藏字段值用于在HPP页面大小更改和事务完成时,使用事件侦听器将数据从Real