diff --git a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cs b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cs index b67518027ae6..33319be8a02c 100644 --- a/src/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cs +++ b/src/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cs @@ -5,6 +5,8 @@ using Android.Graphics.Drawables; using Android.Text.Format; using DateFormat = Android.Text.Format.DateFormat; +using Android.Views; +using Microsoft.Maui.Devices; namespace Microsoft.Maui.Handlers { @@ -26,6 +28,24 @@ protected override void ConnectHandler(MauiTimePicker platformView) platformView.ShowPicker = ShowPickerDialog; platformView.HidePicker = HidePickerDialog; + platformView.ViewAttachedToWindow += OnViewAttachedToWindow; + platformView.ViewDetachedFromWindow += OnViewDetachedFromWindow; + + if (platformView.IsAttachedToWindow) + { + OnViewAttachedToWindow(); + } + } + + void OnViewDetachedFromWindow(object? sender = null, View.ViewDetachedFromWindowEventArgs? e = null) + { + // Called when an activity is destroyed or view is detached + DeviceDisplay.MainDisplayInfoChanged -= OnMainDisplayInfoChanged; + } + + void OnViewAttachedToWindow(object? sender = null, View.ViewAttachedToWindowEventArgs? e = null) + { + DeviceDisplay.MainDisplayInfoChanged += OnMainDisplayInfoChanged; } protected override void DisconnectHandler(MauiTimePicker platformView) @@ -37,8 +57,14 @@ protected override void DisconnectHandler(MauiTimePicker platformView) _dialog = null; } + platformView.ViewAttachedToWindow -= OnViewAttachedToWindow; + platformView.ViewDetachedFromWindow -= OnViewDetachedFromWindow; + OnViewDetachedFromWindow(); + platformView.ShowPicker = null; platformView.HidePicker = null; + + base.DisconnectHandler(platformView); } protected virtual TimePickerDialog CreateTimePickerDialog(int hour, int minute) @@ -174,5 +200,20 @@ bool Use24HourView return IsCustom24HourFormat(VirtualView.Format); } } + + void OnMainDisplayInfoChanged(object? sender, DisplayInfoChangedEventArgs e) + { + // Only handle orientation changes when dialog is actually showing + if (_dialog is not null && _dialog.IsShowing) + { + // Unsubscribe first to prevent the DismissEvent from hiding the new dialog + _dialog.DismissEvent -= OnDialogDismiss; + _dialog.Dismiss(); + _dialog = null; + + // Recreate dialog with current values to handle orientation change + ShowPickerDialog(VirtualView?.Time); + } + } } } \ No newline at end of file