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

.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,同样强制修正为之前的小时值。
    • 其他正常滚动场景,同步更新记录的时间值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:30