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
相关产品推荐
相关产品推荐

