Xamarin.Forms Android DatePicker / TimePicker按钮侦听器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin.Forms Android DatePicker / TimePicker按钮侦听器相关的知识,希望对你有一定的参考价值。

我需要知道用户是否点击取消确定按钮在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();
        }
    }
}

我该怎么做?

答案

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

使用Xamarin.Form的DatePicker,您不能这样做。 Xamarin.Forms.DatePicker渲染到EditText控件中。不幸的是弹出窗口DatePickerDialog并未对用户公开。您可以从Source Codes of DatePickerRenderer看到它。

因此,如果您确实要检测确定/取消按钮的单击事件。您需要根据源代码实现自己的DatePickerRenderer。

另一答案

使用以下Android DatePicker自定义渲染器,您可以完全控制OK和CANCEL。

using Android.App;
using Android.Content;
using ???.Android.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using DatePicker = Android.Widget.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://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/ios/datepicker-selection

以上是关于Xamarin.Forms Android DatePicker / TimePicker按钮侦听器的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin.Forms 中使用 Android 绑定

Xamarin.Forms 3.1.0+版本 Android 原生支持底部导航栏

Xamarin.Forms 3.1.0+版本 Android 原生支持底部导航栏啦

Xamarin.Forms:Android 项目构建错误 - AppData\Local\Xamarin 文件夹中缺少文件

Xamarin.Forms Android 底部导航栏

将Xamarin.Android应用程序迁移到Xamarin.Forms应用程序