我有一个自定义输入字段,可以防止在输入字段获得焦点时出现软键盘。但是,这可以防止发生正常的对焦/失焦事件。 这是安卓渲染器的代码
Control.FocusChange += (sender, eh) =>
{
new Handler().Post(delegate
{
if (eh.HasFocus)
if (Control != null)
{
var imm =
(InputMethodManager)Control.Context.GetSystemService(Android.Content.Context.InputMethodService);
imm.HideSoftInputFromWindow(Control.WindowToken, 0);
}
});
};
这是 Xamarin 中的错误,还是有办法触发焦点和取消焦点事件。
聚焦DatePicker
或TimePicker
时,我在尝试隐藏已经打开的软键盘时遇到了同样的问题。(在某些Android手机中,软键盘位于日期/时间选择器对话框的顶部(。
使用Control.FocusChange
事件处理程序时,未触发打开选取器对话框的默认行为。
溶液:隐藏键盘后,在元素上调用 Focus()
方法以触发正常的焦点事件和默认行为。
这是我的Android DatePicker渲染器代码:
protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)
{
base.OnElementChanged(e);
if (Control == null)
{
return;
}
Control.ShowSoftInputOnFocus = false;
Control.FocusChange += (sender, args) => HideSoftKeyboard(e.NewElement, args);
}
private void HideSoftKeyboard(DatePicker e, FocusChangeEventArgs args)
{
if (args.HasFocus)
{
Device.BeginInvokeOnMainThread(() =>
{
var inputMethodManager = Context.GetSystemService(Context.InputMethodService) as InputMethodManager;
inputMethodManager?.HideSoftInputFromWindow(Control.WindowToken, HideSoftInputFlags.None);
e?.Focus();
});
}
}
<</div>
div class="one_answers"> 根据您的代码,我认为您尝试在 UI 线程中关闭键盘是正确的,我不确定这里的new Handler().Post()
会发生这种情况,但您可以使用BeginInvokeOnMainThread
强制代码在 UI 线程上运行:
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.FocusChange += (sender, eh) =>
{
if (eh.HasFocus)
{
Device.BeginInvokeOnMainThread(() =>
{
var imm = (InputMethodManager)Control.Context.GetSystemService(Context.InputMethodService);
imm.HideSoftInputFromWindow(Control.WindowToken, HideSoftInputFlags.None);
});
}
};
}
}
这段代码在我身边工作,FocusChange
事件可以正常触发。