Xamarin.forms TimePickerDialog Android键盘输入

问题描述 投票:0回答:1

我正在使用具有自定义渲染器功能的Xamarin.Forms TimePicker。当用户使用TimePickerDialog的默认滚动功能时,一切正常。

问题是,当用户点击TimePickerDialog以HH:mm格式更新时间时,我想隐藏Android键盘。

感谢您的帮助和指导。

xamarin.forms android-timepicker
1个回答
0
投票

您可以在自定义渲染器中设置EditTextInputType

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

            if(Control!=null)
            {

               Control.InputType = Android.Text.InputTypes.Null;


            }
        }

更新

[如果您在Android中创建自定义TimePicker,则也可以像[]一样设置DescendantFocusability的属性TimePicker

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

using xxx.Droid;

[assembly:ExportRenderer(typeof(Xamarin.Forms.TimePicker),typeof(MyTimePickerRenderer))]
namespace xxx.Droid
{
    public class MyTimePickerRenderer : TimePickerRenderer
    {
        Context Context;

        IElementController ElementController => Element as IElementController;

        public MyTimePickerRenderer(Context context) : base(context)
        {
            Context = context;
        }


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

            if(Control!=null)
            {

                //  Control.InputType = Android.Text.InputTypes.Null;

                Control.Click += Control_Click;

            }
        }

        private AlertDialog _dialog;


        private void Control_Click(object sender, EventArgs e)
        {
            Xamarin.Forms.TimePicker model = Element;

            Android.Widget.TimePicker picker = new Android.Widget.TimePicker(Context);

            picker.DescendantFocusability = DescendantFocusability.BlockDescendants;  // block keyboard here 

           var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical };
            layout.AddView(picker);

            ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, true);

            var builder = new AlertDialog.Builder(Context);
            builder.SetView(layout);



            builder.SetNegativeButton("Cancel  ", (s, a) =>
            {
                ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
                // It is possible for the Content of the Page to be changed when Focus is changed.
                // In this case, we'll lose our Control.
                Control?.ClearFocus();
                _dialog = null;
            });
            builder.SetPositiveButton("Ok ", (s, a) =>
            {

                ElementController.SetValueFromRenderer(Xamarin.Forms.TimePicker.TimeProperty, new TimeSpan(picker.Hour,picker.Minute,0));
                // It is possible for the Content of the Page to be changed on SelectedIndexChanged.
                // In this case, the Element & Control will no longer exist.
                if (Element != null)
                {

                    ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
                    // It is also possible for the Content of the Page to be changed when Focus is changed.
                    // In this case, we'll lose our Control.
                    Control?.ClearFocus();
                }

                _dialog = null;
            });

            _dialog = builder.Create();
            _dialog.DismissEvent += (ssender, args) =>
            {
                ElementController?.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
            };
            _dialog.Show();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.