【问题标题】:Xamarin Forms pressing back does nothing when the keyboard is hidden隐藏键盘时,按下返回的 Xamarin Forms 不执行任何操作
【发布时间】:2019-01-01 23:19:17
【问题描述】:

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

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

      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。一次退出隐藏键盘(条目失去焦点),然后再次退出页面。我想避免这种情况——当键盘被隐藏时,他们应该能够一键退出页面。有谁知道如何解决这个问题?正如其他答案所建议的那样,我已经尝试在自定义渲染器中覆盖 OnKeyPreIme,但它似乎没有检测到返回点击。

【问题讨论】:

    标签: android xamarin.forms android-softkeyboard back


    【解决方案1】:

    当您的输入获得焦点时,您可以使用隐藏键盘方法。它可能解决了你的问题。

    public interface IKeyboardHelper
    {
        void HideKeyboard();
    }
    

    安卓使用:

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

    【讨论】:

    • 谢谢 - 当控件有焦点并且键盘被隐藏时,这不会被击中。您必须按两次后退才能使用此方法。
    • 我已经更新了我的答案,请尝试。我不知道具体是做什么的,但可能会对您有所帮助。
    • 谢谢,我会试一试的。
    【解决方案2】:

    我(终于)解决了。关键不是要覆盖 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? 希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 2017-05-23
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      相关资源
      最近更新 更多