我正在使用具有自定义渲染器功能的Xamarin.Forms TimePicker。当用户使用TimePickerDialog的默认滚动功能时,一切正常。
问题是,当用户点击TimePickerDialog以HH:mm格式更新时间时,我想隐藏Android键盘。
感谢您的帮助和指导。
您可以在自定义渲染器中设置EditText
的InputType
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();
}
}
}