在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); } } }