Xamarin Forms нажатие назад ничего не делает, когда клавиатура скрыта

Я пишу приложение Xamarin Forms (стандарт .NET 2.0). В настоящее время он разрабатывается только для Android, но в будущем может быть выпущен для других ОС. Сценарий, которым я пытаюсь управлять, таков:

  • Пользователь переходит на ContentPage с помощью одной записи
  • Я даю фокус Entry, используя собственный код 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();                                   
            }
        }
    
  • Я не хочу, чтобы программная клавиатура выскакивала автоматически. Поэтому я добавил следующую строку в OnCreate MainActivity:

     Window.SetSoftInputMode(SoftInput.StateAlwaysHidden);
    

Причина, по которой я запрашиваю фокус в пользовательском средстве визуализации, а не в записи Xamarin Forms, заключается в том, что я мог видеть всплывающее окно клавиатуры, а затем сразу же исчезать, когда я запрашивал его в элементе управления Xamarin Forms. Я не хочу, чтобы клавиатура появлялась, поскольку это приложение будет в основном использоваться пользователями промышленных устройств с аппаратной клавиатурой, но запись должна иметь фокус, поскольку пользователи захотят сразу же ввести в нее текст.

Моя проблема в том, что в этом сценарии пользователь должен дважды нажать кнопку «Назад», чтобы выйти из ContentPage. Один раз для выхода из скрытой клавиатуры (и Entry теряет фокус), а затем еще раз для выхода со страницы. Я хочу избежать этого - они должны иметь возможность выходить со страницы одним щелчком мыши, когда клавиатура скрыта. Кто-нибудь знает, как это решить? Я попытался переопределить OnKeyPreIme в пользовательском рендерере, как предлагали другие ответы, но, похоже, он не обнаруживает обратный щелчок.


person David Christopher Reynolds    schedule 25.07.2018    source источник


Ответы (2)


Вы можете использовать метод Hide Keyboard, когда ваша запись сфокусирована. Это могло решить вашу проблему.

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();
    }
person Srusti Thakkar    schedule 26.07.2018
comment
Спасибо - это не происходит, когда элемент управления находится в фокусе, а клавиатура скрыта. Вам нужно дважды нажать назад, чтобы перейти к этому методу. - person David Christopher Reynolds; 26.07.2018
comment
Я обновил свой ответ, попробуйте. Я не знаю, что именно делать, но могу вам помочь. - person Srusti Thakkar; 26.07.2018
comment
Спасибо, я попробую. - person David Christopher Reynolds; 26.07.2018

Я (наконец) решил это. Ключ состоит не в том, чтобы переопределить 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 основан на ответе на этот вопрос: Как определить, отображается ли программная клавиатура на устройстве Android? Надеюсь, это кому-то поможет.

person David Christopher Reynolds    schedule 17.09.2018