You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android自定义TimePicker Dialog点击需两次关闭问题排查

解决自定义TimePicker Dialog的闪烁、重复点击关闭及日志重复问题

核心问题分析与修复

1. 日志重复打印+需两次点击关闭Dialog

这两个问题的根源是**selectTime函数被重复调用了两次**,导致创建了两个完全重叠的Dialog:

  • 点击按钮时,先关闭的是上层的Dialog,下层的Dialog依然存在,所以需要第二次点击才能完全关闭;
  • 函数被调用两次,自然会重复打印日志。

修复方案:

  • 先检查调用selectTime的代码逻辑,比如是否在Fragment的生命周期方法(如onViewCreated)、点击事件监听器里重复触发了调用,是否存在多个相同的点击监听器绑定;
  • 给Fragment添加Dialog的全局引用,避免重复创建:
    // 在Fragment类中声明
    private var timeDialog: Dialog? = null
    
    fun selectTime(context: Context) {
        // 先判断是否已有Dialog在显示,避免重复创建
        if (timeDialog?.isShowing == true) {
            return
        }
    
        val currentTime = Calendar.getInstance()
        val hour = currentTime.get(Calendar.HOUR_OF_DAY)
        val minute = currentTime.get(Calendar.MINUTE)
    
        timeDialog = Dialog(context).apply {
            requestWindowFeature(Window.FEATURE_NO_TITLE)
            setCancelable(false)
            setContentView(R.layout.custom_time_picker)
            // 提前设置window参数,避免闪烁
            window?.apply {
                setBackgroundDrawableResource(R.color.transparent)
                setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
            }
    
            val timePicker = findViewById<TimePicker>(R.id.timePicker)
            val ok = findViewById<TextView>(R.id.ok)
            val cancel = findViewById<TextView>(R.id.cancel)
    
            timePicker.setIs24HourView(true)
            timePicker.hour = hour
            timePicker.minute = minute
    
            cancel.setOnClickListener {
                dismiss()
                timeDialog = null // 销毁引用
            }
    
            ok.setOnClickListener {
                val selectedHour = timePicker.hour
                val selectedMinute = timePicker.minute
                Log.e("time-->","$selectedHour:$selectedMinute")
                dismiss()
                timeDialog = null // 销毁引用
            }
        }
    
        timeDialog?.show()
    }
    

2. Dialog打开时的闪烁问题

你之前在dialog.show()之后才设置window的背景和布局参数,这会导致Dialog先以默认样式渲染,再更新为自定义样式,从而出现闪烁。修复方法是把window相关的配置移到dialog.show()之前完成,上面的代码已经包含了这个修改。

额外注意点

如果你的自定义布局custom_time_picker里的按钮(ok/cancel)本身也设置了点击事件(比如在XML里用android:onClick),也会导致点击事件被触发两次,需要检查XML布局是否存在重复绑定的情况。

内容的提问来源于stack exchange,提问作者Ayush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:32