Xamarin,重写自定义呈现器中的焦点更改可阻止焦点事件的发生



我有一个自定义输入字段,可以防止在输入字段获得焦点时出现软键盘。但是,这可以防止发生正常的对焦/失焦事件。 这是安卓渲染器的代码

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 中的错误,还是有办法触发焦点和取消焦点事件。

聚焦DatePickerTimePicker时,我在尝试隐藏已经打开的软键盘时遇到了同样的问题。(在某些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事件可以正常触发。

最新更新