在Xamarin中隐藏软键盘

在Xamarin.forms便携式表单项目中聚焦Entry时,如何隐藏软键盘以显示? 我假设我们必须为此编写特定于平台的渲染器,但以下内容不起作用:

我创建自己的入口子类:

 public class MyExtendedEntry : Entry { } 

然后在xamarin.android项目中我的渲染器:

 public class MyExtendedEntryRenderer : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if (Control != null) { new Handler().Post(delegate { var imm = (InputMethodManager)Control.Context.GetSystemService(Context.InputMethodService); var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); }); } } } 

按预期调用OnElementChanged ,当使用Handler.Post()我也得到一个WindowToken而不是null。 可悲的是, HideSoftInputFromWindow的返回值始终为false,单击条目时软键盘仍会显示。

只要视图初始化并附加到视图,就会调用OnElementChanged 。 你想要做的是在单击条目时隐藏键盘,因此你应该向FocusChange添加一个事件处理程序给Control

例:

  protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if (Control != null) { Control.Click += (sender, evt) => { new Handler().Post(delegate { var imm = (InputMethodManager)Control.Context.GetSystemService(Android.Content.Context.InputMethodService); var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); Console.WriteLine(result); }); }; Control.FocusChange += (sender, evt) => { new Handler().Post(delegate { var imm = (InputMethodManager)Control.Context.GetSystemService(Android.Content.Context.InputMethodService); var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); Console.WriteLine(result); }); }; } } 

更新:来自@Vikram的综合答案

更新:添加了Click事件处理程序

注意:我不熟悉Xamarin。

根据我的经验,在控件获得焦点后立即使用imm.HideSoftInputFromWindow(Control.WindowToken, 0)会产生狡猾的结果,即使使用Post 。 我使用PostDelayed取得了成功。 我使用的延迟是500ms。

尝试一下:

 public class MyExtendedEntryRenderer : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if (Control != null) { new Handler().PostDelayed(delegate { var imm = (InputMethodManager)Control.Context.GetSystemService(Context.InputMethodService); var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); }, 500L); } } }