.NET MAUI Android:阻止滚轮TimePicker分钟越界时自动增减小时
解决Android Legacy TimePicker分钟滚动时小时自动增减的问题
要实现阻止分钟滚轮跨边界(59→0或0→59)时小时自动变化的需求,你需要在自定义的LegacyTimePickerHandler中获取原生TimePicker控件,通过设置时间变化监听器来拦截并修正小时值。以下是完整的实现代码:
public class LegacyTimePickerHandler : TimePickerHandler { // 记录上一次的小时和分钟值,用于判断滚轮滚动方向 private int _lastHour; private int _lastMinute; protected override TimePickerDialog CreateTimePickerDialog(int hour, int minute) { // 初始化记录的初始时间值 _lastHour = hour; _lastMinute = minute; TimePickerDialog timePickerDialog = new( Context, Microsoft.Maui.Controls.Application.Current.RequestedTheme == AppTheme.Dark ? global::Android.Resource.Style.ThemeHoloDialogNoActionBarMinWidth : global::Android.Resource.Style.ThemeHoloLightDialogNoActionBarMinWidth, (s, e) => { VirtualView.Time = new TimeOnly(e.HourOfDay, e.Minute, 0).ToTimeSpan(); DateTime dateTime = DateTime.Today.Add(VirtualView.Time); PlatformView.Text = dateTime.ToString("HH:mm"); }, hour, minute, true); // 获取对话框内的原生TimePicker控件 TimePicker timePicker = timePickerDialog.TimePicker; // 设置自定义时间变化监听器 timePicker.SetOnTimeChangedListener(new CustomTimeChangedListener(this)); return timePickerDialog; } // 自定义时间变化监听器,处理小时自动增减的拦截逻辑 private class CustomTimeChangedListener : Java.Lang.Object, ITimePickerOnTimeChangedListener { private readonly LegacyTimePickerHandler _handler; public CustomTimeChangedListener(LegacyTimePickerHandler handler) { _handler = handler; } public void OnTimeChanged(TimePicker view, int hourOfDay, int minute) { // 拦截分钟从59滚到0时的小时递增操作 if (_handler._lastMinute == 59 && minute == 0) { view.SetCurrentHour(_handler._lastHour); _handler._lastMinute = minute; } // 拦截分钟从0滚到59时的小时递减操作 else if (_handler._lastMinute == 0 && minute == 59) { view.SetCurrentHour(_handler._lastHour); _handler._lastMinute = minute; } // 正常滚动场景,更新记录的时间值 else { _handler._lastHour = hourOfDay; _handler._lastMinute = minute; } } } }
关键逻辑说明
_lastHour和_lastMinute:用于记录上一次的时间状态,以此判断分钟滚轮的滚动方向。CustomTimeChangedListener:实现原生Android的ITimePickerOnTimeChangedListener接口,在时间变化回调中:- 当分钟从59跳转到0时,系统会自动将小时+1,这里通过
SetCurrentHour强制把小时改回之前记录的值。 - 当分钟从0跳转到59时,系统会自动将小时-1,同样强制修正为之前的小时值。
- 其他正常滚动场景,同步更新记录的时间值即可。
- 当分钟从59跳转到0时,系统会自动将小时+1,这里通过
内容的提问来源于stack exchange,提问作者Nico Fourie
相关产品推荐
相关产品推荐

