在Xamarin.forms移动表单项目中聚焦Entry
时,如何隐藏软键盘以显示?我假设我们必须为此编写特定于平台的渲染器,但以下内容不起作用:
我创建了自己的入口子类:
public class MyExtendedEntry : Entry
{
}
然后在xamarin.android项目中我的渲染器:
public class MyExtendedEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Entry> 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,单击条目时软键盘仍会显示。
答案 0 :(得分:4)
OnElementChanged
。您要做的是在单击条目时隐藏键盘,因此您应该将事件处理程序添加到FocusChange
{。}}。
示例:强>
Control
更新: @Vikram
的综合答案 更新:添加了 protected override void OnElementChanged(ElementChangedEventArgs<Entry> 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);
});
};
}
}
事件处理程序
答案 1 :(得分:3)
注意:我不熟悉Xamarin。
根据我的经验,即使使用imm.HideSoftInputFromWindow(Control.WindowToken, 0)
,在控件获得焦点后立即使用Post
也会产生狡猾的结果。我使用PostDelayed
取得了成功。我使用的延迟是500ms。
尝试一下:
public class MyExtendedEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Entry> 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);
}
}
}
答案 2 :(得分:-1)
防止出现虚拟键盘的键是重写Entry的Focus()方法,而不调用基方法。否则,无论您做什么,它总是会偶尔出现。这具有简化所需代码的附加好处,因为您可以自动控制虚拟键盘的外观和外观。到目前为止,我还没有发现这种方法的任何负面影响。
我创建了一个示例控件,可以完全控制虚拟键盘和一个显示用法的小应用程序。
由于在几个论坛中都提出了这个问题,所以我决定在项目中编写详细的自述文件,以解释实施的所有关键点,而不是在多个不同的论坛中重复解释。我希望可以。如果没有,请告诉我。
整个项目在这里可用: https://github.com/UweReisewitz/XamarinAndroidEntry