聚焦字段时未触发Xamarin Forms BACK BUTTON

时间:2019-06-18 07:32:14

标签: android xamarin xamarin.forms

当某个条目被聚焦并且您回击时,唯一发生的事情就是对该条目进行聚焦。再次击中后退按钮,然后实际触发它。

只需通过点击屏幕上的另一个点来使条目聚焦,然后点击返回按钮就会触发后退按钮。

我们希望即使在重点关注某个条目的情况下也可以触发后退按钮。有什么建议可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

这是Android应用而不是Xamarin.Forms的工作方式。

要获得更多控制,您需要在Android项目的Activity中覆盖OnKeyPreIme,检测出这种情况并进行处理。这是在Java中完成的过程:EditText with soft keyboard and "Back" button

答案 1 :(得分:1)

您可以使用CustomRender和Custom EditText,覆盖OnKeyPreIme方法

1。在.Android中自定义一个EditText,在这里名为 MyEditText

class MyEditext :EditText
{
    protected MyEditext(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public MyEditext(Context context) : base(context)
    {
    }

    public MyEditext(Context context, IAttributeSet attrs) : base(context, attrs)
    {
    }

    public MyEditext(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
    {
    }

    public MyEditext(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes)
    {
    }

    //This method can be used to intercept keystroke events, typically handling the back key, updating the UI, and if you don't override this method, the IME will default to handling the keyboard (usually the keyboard disappears)
    public override bool OnKeyPreIme(Keycode keyCode, KeyEvent e)
    {
        if (keyCode == Keycode.Back)
        {
            if (listener !=null)
            {
                listener.onKeyBack();
                return true;
            }
        }
        return base.OnKeyPreIme(keyCode, e);
    }

    private OnEditTextKeyBackListener listener;
    public void SetOnEditTextKeyBackListener(OnEditTextKeyBackListener listener)
    {
        this.listener = listener;
    }

    public interface OnEditTextKeyBackListener
    {
        void onKeyBack();

    }
}

2。使用CustomRender,创建 MyEntryRenderer

    [assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRender))]
    namespace App18.Droid
    {
      class MyEntryRender : ViewRenderer<Entry,EditText>, MyEditext.OnEditTextKeyBackListener
        {
          private Context _context;
          public MyEntryRender(Context context) : base(context)
            {
             _context = context;
            }

          protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
            {
              base.OnElementChanged(e);
              MyEditext editext = new MyEditext(_context);
              SetNativeControl(editext);
              editext.SetOnEditTextKeyBackListener(this);
            }


         public void onKeyBack()
            {
            _context.GetActivity().OnBackPressed();
            }
       } 
    }

答案 2 :(得分:0)

我的建议是将CustomPage和CustomEntry作为组件。 然后,在CustomPage中,您可以覆盖OnBackButtonPressed,在CustomEntry中,可以将Focus / Unfocus事件附加到您的自定义逻辑中。 这样就可以了,因为这样便可以在任何地方使用它,只需始终检查导航堆栈即可。

{
        public CustomPage()
        {
            InitializeComponent();
        }

        protected override bool OnBackButtonPressed()
        {
            //your logic for navigating back
           //don't forget to do all the checks
        }
}

然后仅使用此页面而不是常规的ContentPage。