Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Xamarin表单隐藏键盘时,按back不会执行任何操作_Android_Xamarin.forms_Android Softkeyboard_Back - Fatal编程技术网

Android Xamarin表单隐藏键盘时,按back不会执行任何操作

Android Xamarin表单隐藏键盘时,按back不会执行任何操作,android,xamarin.forms,android-softkeyboard,back,Android,Xamarin.forms,Android Softkeyboard,Back,我正在编写一个Xamarin表单应用程序(.net标准2.0)。目前它只为Android开发,但将来可能会为其他OSs发布。我尝试管理的场景如下: 用户只需输入一个条目即可进入ContentPage 我通过在自定义渲染器中使用本机Android代码来提供入口焦点: if (e.NewElement != null && e.NewElement is CustomEntry) { CustomEntry customEntry = (

我正在编写一个Xamarin表单应用程序(.net标准2.0)。目前它只为Android开发,但将来可能会为其他OSs发布。我尝试管理的场景如下:

  • 用户只需输入一个条目即可进入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,但它似乎没有检测到反向单击。

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

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);
    }
}
使用
依赖项注入
并在条目集中时调用此方法

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

 protected override bool OnBackButtonPressed()
    {          
        // you can handle back button pressed event in Xamarin forms page  
        return base.OnBackButtonPressed();
    }
我(终于)解决了。关键不是覆盖OnKeyPreIME,而是调度KeyEventPreime。这允许您拦截“后退”按钮。因此,在我的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是我创建的一个接口,用于处理back按键。SIPVisibleListener基于对以下问题的回答:
希望这会对某人有所帮助。

谢谢-当控件有焦点且键盘隐藏时,不会点击此按钮。您必须按两次后退才能使用此方法。我已更新了我的ans,请重试。我不知道该怎么做,但可能对你有帮助。谢谢你,我会试试的。