键盘隐藏时,Xamarin Forms按下不起作用

时间:2018-07-25 08:03:25

标签: android xamarin.forms android-softkeyboard back

我正在编写Xamarin Forms应用程序(.net标准2.0)。目前,它仅针对Android开发,但将来可能会发布给其他操作系统。我要管理的方案是这样的:

  • 用户通过一个条目进入ContentPage
  • 我通过在自定义渲染器中使用本机Android代码来赋予Entry焦点:

      if (e.NewElement != null && e.NewElement is CustomEntry)
            {
                CustomEntry customEntry = (CustomEntry)e.NewElement;
    
            if(customEntry.GiveFocus)
            {
                //this messes up the onback behaviour - you have to press onback twice to exit the screen, once to get out of the hidden SIP
                Control.RequestFocus();                                   
            }
        }
    
  • 我不希望软键盘自动弹出。因此,我将以下行添加到MainActivity的OnCreate中:

     Window.SetSoftInputMode(SoftInput.StateAlwaysHidden);
    

我请求在自定义渲染器而不是Xamarin Forms条目中聚焦的原因是,我可以看到键盘弹出窗口,然后在Xamarin Forms控件中请求它时立即消失。我不希望键盘出现,因为该应用程序将主要用于带有硬件键盘的工业设备的用户,但是由于用户希望立即在其中输入文本,因此该条目需要重点关注。

我的问题是在这种情况下用户必须按两次返回按钮才能退出ContentPage。一次退出隐藏的键盘(Entry失去焦点),然后再次退出页面。我要避免这种情况-隐藏键盘后,他们只需单击一下就能退出页面。有谁知道如何解决这个问题?我已经尝试过在自定义渲染器中覆盖OnKeyPreIme,如其他答案所建议的那样,但是它似乎无法检测到后退点击。

2 个答案:

答案 0 :(得分:0)

您可以在输入焦点时使用“隐藏键盘”方法。它可能解决了您的问题。

public interface IKeyboardHelper
{
    void HideKeyboard();
}

对于Android使用:

 public class DroidKeyboardHelper : IKeyboardHelper
{
    public void HideKeyboard()
    {
        var context = Forms.Context;
        var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager;
        if (inputMethodManager != null && context is Activity)
        {
            var activity = context as Activity;
            var token = activity.CurrentFocus?.WindowToken;
            inputMethodManager.HideSoftInputFromWindow(token, HideSoftInputFlags.None);

            activity.Window.DecorView.ClearFocus();
        }
    }
}

对于iOS:

    public class iOSKeyboardHelper : IKeyboardHelper
{
    public void HideKeyboard()
    {
        UIApplication.SharedApplication.KeyWindow.EndEditing(true);
    }
}

使用Dependency Injection并在输入内容集中时调用此方法。

尝试使用以下方法处理后退按钮按下事件。

 protected override bool OnBackButtonPressed()
    {          
        // you can handle back button pressed event in Xamarin forms page  
        return base.OnBackButtonPressed();
    }

答案 1 :(得分:0)

我(终于)解决了。关键不是要覆盖OnKeyPreIME,而是要覆盖DispatchKeyEventPreIme。这使您可以拦截“后退”新闻。因此,在我的CustomRenderer中,我添加了以下方法:

 public override bool DispatchKeyEventPreIme(KeyEvent e)
    {
        //if this is back press and the sip is not visible then we need to call the 'OnBack' method at the view model level
        if(!SIPVisibleListener.IsSIPVisible && e.KeyCode == Keycode.Back)
        {
           if(XamarinFormsControl != null && XamarinFormsControl is IOnBackHandler)
            {
                ((IOnBackHandler)XamarinFormsControl).GoBack();
            }
        }

        return base.DispatchKeyEventPreIme(e);
    }

IOnBackHandler是我创建的用于处理后退按键的接口。 SIPVisibleListener基于以下问题的答案:How do I Detect if Software Keyboard is Visible on Android Device? 希望这会对某人有所帮助。