Открыть экранную клавиатуру для Xamarin/Monogame

Я разрабатываю игру с использованием Xamarin/Monogame, и мне нужно открыть клавиатуру на мобильном устройстве, когда они нажимают на мой элемент управления вводом. Я понимаю, что могу записывать ввод с помощью Keyboard.GetState(), когда использую эмулятор и клавиатуру, но у реальных пользователей будут физические устройства, и мне нужно открыть экранную клавиатуру, чтобы они могли вводить информацию. Я не вижу ничего в какой-либо документации, описывающей это, но трудно поверить, что я первый, кто столкнулся с этим. Я просмотрел документацию Xamarin/Monogame по входу. и я прочитал эту статью StackOverflow. Дайте мне знать, если вам нужна дополнительная информация, чтобы решить эту проблему. Заранее благодарю за любую помощь.


person Will Custode    schedule 07.08.2016    source источник
comment
Добрый день, я тоже случайно наткнулась и не могу найти никакой информации. Приведенное ниже решение выглядит так, как будто оно предназначено только для Android. Нет ли запакованного решения, которое работает как для iOS, так и для Android в моноигре?   -  person R10t--    schedule 08.02.2020


Ответы (1)


После долгих копаний я смог найти решение. Сначала я начну с объяснения того, как я туда попал: я перестал думать «как мне отобразить экранную клавиатуру в Mono?» и начал думать "как у вас отображается клавиатура на Android-устройстве?" Это привело меня к этой статье что было идеально; Xamarin и Android. Вот соответствующие фрагменты:

Показ программного ввода (экранная клавиатура)

var pView = game.Services.GetService<View>();
var inputMethodManager = Application.GetSystemService(Context.InputMethodService) as InputMethodManager;
inputMethodManager.ShowSoftInput(pView, ShowFlags.Forced);
inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);

Некоторые ключевые замечания по этому поводу:

  • Класс View — это Android.Views.View.
  • InputMethodManager класс Android.Views.InputMethods.InputMethodManager
  • Этот код вызывается из класса Activity, поэтому Application относится к свойству этого класса (this.Application).
  • game — это ваш игровой класс (в Mono) типа Microsoft.Xna.Framework.Game.

Скрытие программного ввода (экранная клавиатура)

InputMethodManager inputMethodManager = Application.GetSystemService(Context.InputMethodService) as InputMethodManager;
inputMethodManager.HideSoftInputFromWindow(pView.WindowToken, HideSoftInputFlags.None);

После того, как я решил эту проблему, то, как я захватывал ввод (способ XNA/Mono), не захватывал этот ввод. Так что пришлось продолжать копать. Хотя это не обязательно относится к этому вопросу, я хотел бы опубликовать его здесь, чтобы он где-то существовал. Мне помогла эта документация на сайте разработчиков Android.

Чтобы захватить ввод напрямую (что нам нужно сделать, чтобы захватить ввод OSK), вам нужно переопределить метод OnKeyPress для действия, в котором выполняется ваша игра. Для меня это выглядит следующим образом:

public class AndroidActivity : AndroidGameActivity
{
    private void OnKeyPress(object sender, View.KeyEventArgs e)
    {
        // do stuff with the input
    }
}

Надеюсь, это поможет всем, кто застрял с этим; информацию было трудно найти, но теперь, когда я изменил свое мнение на «как Android/iOS справляется с этой задачей», мне стало легче находить ответы. Удачи!

person Will Custode    schedule 08.08.2016
comment
В MonoGame 3.7 мне пришлось подписаться на событие KeyPress моего View, чтобы оно заработало. MainGame g = new MainGame(); var v = (View)g.Services.GetService(typeof(View)); v.KeyPress += OnKeyPress; - person user2475983; 25.11.2018
comment
Я использую этот метод, и он отлично работает... за исключением некоторых телефонов. На некоторых телефонах клавиша Backspace не работает, и чтобы она работала, ее нужно удерживать. На других телефонах нужно дважды нажимать на каждую клавишу, а на других ничего не делается. Любые решения для них? Это проблема моноигры или проблема с вводом с программной клавиатуры? - person tval; 25.03.2019