Xamarin.Forms Android日期选择器/时间选择器按钮监听器

4

我需要知道用户是否点击了 取消确定 按钮,这是在 xamarin.Forms Android 应用程序中的 日期/时间选择器 中。

我已尝试向 Click 事件添加函数,但该函数从未触发。

这是我的代码(类似于 TimePicker):

using Android.Content;
using MyApp.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using MyApp.Models;
using Java.Util;

[assembly: ExportRenderer(typeof(DatePicker), typeof(DatePickerCustomRenderer))]

namespace MyApp.Droid {
    public class DatePickerCustomRenderer : DatePickerRenderer {

        public DatePickerCustomRenderer(Context context) : base(context) { } 

        protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) {
            base.OnElementChanged(e);

            Locale locale = new Locale(Utente.FormatoPerDateTimePicker);
            Control.TextLocale = locale;

            Control.Click += Control_Click;
        }

        private void Control_Click(object sender, System.EventArgs e) {
            // This function is never called :(
            throw new System.NotImplementedException();
        }
    }
}

我该如何做到这一点?

3个回答

3
使用以下Android DatePicker自定义渲染器,您完全控制OK和CANCEL。
using Android.App;
using Android.Content;
using ???.Android.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using DatePicker = Xamarin.Forms.DatePicker;

[assembly: ExportRenderer(typeof(DatePicker), typeof(FixedDatePickerRenderer))]    
namespace ???.Android.Renderers
{
    public class FixedDatePickerRenderer : Xamarin.Forms.Platform.Android.DatePickerRenderer
    {
        public FixedDatePickerRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.DatePicker> e)
        {
            base.OnElementChanged(e);

            //Disposing
            if (e.OldElement != null)
            {
                _element = null;
            }

            //Creating
            if (e.NewElement != null)
            {
                _element = e.NewElement;
            }
        }

        protected Xamarin.Forms.DatePicker _element;

        protected override DatePickerDialog CreateDatePickerDialog(int year, int month, int day)
        {
            var dialog = new DatePickerDialog(Context, (o, e) =>
            {
                _element.Date = e.Date;
                ((IElementController)_element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false);
            }, year, month, day);

            dialog.SetButton((int)DialogButtonType.Positive, Context.Resources.GetString(global::Android.Resource.String.Ok), OnOk);
            dialog.SetButton((int)DialogButtonType.Negative, Context.Resources.GetString(global::Android.Resource.String.Cancel), OnCancel);

            return dialog;
        }

        private void OnCancel(object sender, DialogClickEventArgs e)
        {
            _element.Unfocus();
            //((FixedDatePicker) _element)?.CallOnCancel();
        }
        private void OnOk(object sender, DialogClickEventArgs e)
        {
            //need to set date from native control manually now
            _element.Date = ((DatePickerDialog)sender).DatePicker.DateTime;
            _element.Unfocus();
            //((FixedDatePicker)_element)?.CallOnOk();
        }

    }

}


 

如果您正在寻找完整的解决方案以避免搜索iOS,那么已经包含了一个选项: https://learn.microsoft.com/en-us/xamarin/xamarin-forms/platform/ios/datepicker-selection


2
我需要知道在Xamarin.Forms Android应用的日期/时间选择器中,用户是点击了“取消”还是“确定”按钮。但是使用Xamarin.Form的DatePicker是做不到的。 Xamarin.Forms.DatePicker被渲染成一个EditText控件。弹出的DatePickerDialog不幸没有暴露给用户。你可以从DatePickerRenderer源代码中看到这一点。因此,如果你真的想要检测OK / Cancel按钮的单击事件,你需要根据源代码实现自己的DatePickerRenderer。

哦 :( 谢谢。 - Hikari
@elvis-xia-msft,从你的示例中我只获得了日期选择器的取消点击事件。我需要获取确定按钮的点击事件。当更改日期时,将调用OnElement属性更改重写方法。但是第一次打开日期选择器并单击“确定”按钮时,不会调用任何事件。 - sameer

1

对于Android,Nick Kovalsky使用自定义渲染器的解决方案对我很有效。

对于iOS,开箱即用的iOS特定解决方案对我不起作用, https://learn.microsoft.com/en-us/xamarin/xamarin-forms/platform/ios/datepicker-selection

我也使用了自定义渲染器方法来处理iOS, 查看Xamarin自定义渲染器(在iOS平台上),我们可以看到InputAccessoryView设置为UIToolbar,并且工具栏包含完成按钮(UIBarButtonItem)。因此,我们可以使用完成按钮并侦听单击事件,
https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs

[assembly: ExportRenderer(typeof(CustomDatePicker), typeof(MyApp.iOS.CustomRenderers.CustomDatePickerRenderer))]
public class CustomDatePickerRenderer : DatePickerRenderer
    {      
        CustomDatePicker _datePickerElement ;

        protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement is CustomDatePicker datePickerElement && Control != null)
            {
                _datePickerElement = datePickerElement;                

                var toolbar = Control.InputAccessoryView as UIToolbar;
                foreach (var button in toolbar?.Items)
                {
                    if (button.Style == UIBarButtonItemStyle.Done)
                    {
                        button.Clicked -= OnDoneButtonClicked;
                        button.Clicked += OnDoneButtonClicked;
                    }
                }
            }
        }

        private void OnDoneButtonClicked(object sender, EventArgs e)
        {
            if(_datePickerElement.NullableDate != _datePickerElement.Date)
            {
                _datePickerElement.NullableDate = _datePickerElement.Date;
            }            
        }

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接