在Xamarin中隐藏软键盘

时间:2015-03-03 15:08:19

标签: c# android xamarin xamarin.android xamarin.forms

在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,单击条目时软键盘仍会显示。

3 个答案:

答案 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