如何监听TimePicker关闭?如何区分实例及接口重构实现?
val newFragment: DialogFragment = TimepickerAlarm() fragmentManager?.let { it1 -> newFragment.show(it1, "timePicker") ... }
override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
}
}
--- ### 问题解答 #### 1. 监听Timepicker的关闭事件 有两种可靠实现方式: - **方式一:重写DialogFragment的`onDismiss`方法** 直接在`TimepickerAlarm`类中重写该方法,即可捕获弹窗关闭事件: ```kotlin class TimepickerAlarm: DialogFragment(){ // ... 原有代码 ... override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) // 这里编写弹窗关闭后的逻辑,比如通知调用方 } }
- 方式二:给TimePickerDialog设置OnDismissListener
在onCreateDialog中创建弹窗实例时,直接绑定关闭监听器:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val c: Calendar = Calendar.getInstance() val hour = c.get(Calendar.HOUR_OF_DAY) val minute = c.get(Calendar.MINUTE) val timePickerDialog = TimePickerDialog( requireContext(), Extendenitemview() as OnTimeSetListener, hour, minute, DateFormat.is24HourFormat(requireContext()) ) // 设置关闭监听器 timePickerDialog.setOnDismissListener { // 弹窗关闭时执行的逻辑 } return timePickerDialog }
2. 通过Fragment标签区分不同实例
完全可以实现,步骤如下:
步骤1:调用时传入不同标签
在Extendenitemview中调用弹窗时,给不同场景传入唯一标签:
// 场景1:设置起床时间 val alarmPicker1 = TimepickerAlarm() fragmentManager?.show(alarmPicker1, "timePicker_wakeup") // 场景2:设置午休时间 val alarmPicker2 = TimepickerAlarm() fragmentManager?.show(alarmPicker2, "timePicker_noon")
步骤2:在监听逻辑中区分标签
首先需要修正原代码中直接实例化Extendenitemview的错误(会导致监听器失效),改为通过onAttach绑定监听器,再通过tag区分:
class TimepickerAlarm: DialogFragment(){ private var timeSetListener: OnTimeSetListener? = null override fun onAttach(context: Context) { super.onAttach(context) // 绑定调用方的监听器 timeSetListener = context as? OnTimeSetListener ?: parentFragment as? OnTimeSetListener } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val c: Calendar = Calendar.getInstance() val hour = c.get(Calendar.HOUR_OF_DAY) val minute = c.get(Calendar.MINUTE) return TimePickerDialog( requireContext(), { _, selectedHour, selectedMinute -> timeSetListener?.onTimeSet(this@TimepickerAlarm.dialog as? TimePicker, selectedHour, selectedMinute) // 直接通过当前DialogFragment的tag区分场景 when(tag) { "timePicker_wakeup" -> { /* 处理起床时间逻辑 */ } "timePicker_noon" -> { /* 处理午休时间逻辑 */ } } }, hour, minute, DateFormat.is24HourFormat(requireContext()) ) } override fun onDetach() { super.onDetach() timeSetListener = null // 避免内存泄漏 } }
也可以在Extendenitemview的onTimeSet方法中,通过查找Fragment实例来区分:
override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) { if (fragmentManager?.findFragmentByTag("timePicker_wakeup") != null) { // 处理起床时间逻辑 } else if (fragmentManager?.findFragmentByTag("timePicker_noon") != null) { // 处理午休时间逻辑 } }
3. 在Timepicker类中通过自定义接口实现功能
当然可以,这种方式更灵活,还能自定义回调事件:
步骤1:在TimepickerAlarm中定义自定义接口
class TimepickerAlarm: DialogFragment(){ // 自定义接口,包含时间选择和弹窗关闭的回调 interface OnTimePickerInteractionListener { fun onTimeSelected(hour: Int, minute: Int) fun onTimePickerDismissed() } private var interactionListener: OnTimePickerInteractionListener? = null override fun onAttach(context: Context) { super.onAttach(context) // 绑定接口,优先从Activity获取,其次是父Fragment interactionListener = context as? OnTimePickerInteractionListener ?: parentFragment as? OnTimePickerInteractionListener } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val c: Calendar = Calendar.getInstance() val hour = c.get(Calendar.HOUR_OF_DAY) val minute = c.get(Calendar.MINUTE) val timePickerDialog = TimePickerDialog( requireContext(), { _, selectedHour, selectedMinute -> interactionListener?.onTimeSelected(selectedHour, selectedMinute) }, hour, minute, DateFormat.is24HourFormat(requireContext()) ) // 绑定弹窗关闭回调 timePickerDialog.setOnDismissListener { interactionListener?.onTimePickerDismissed() } return timePickerDialog } override fun onDetach() { super.onDetach() interactionListener = null // 防止内存泄漏 } }
步骤2:在Extendenitemview中实现自定义接口
class Extendenitemview : Fragment(), TimepickerAlarm.OnTimePickerInteractionListener { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // ... 原有代码 ... val newFragment = TimepickerAlarm() fragmentManager?.show(newFragment, "timePicker") // ... } override fun onTimeSelected(hour: Int, minute: Int) { // 处理用户选择的时间 } override fun onTimePickerDismissed() { // 处理弹窗关闭事件 } }
内容的提问来源于stack exchange,提问作者OVO Cuenta
相关产品推荐
相关产品推荐

