Я разрабатываю игру с использованием Xamarin/Monogame, и мне нужно открыть клавиатуру на мобильном устройстве, когда они нажимают на мой элемент управления вводом. Я понимаю, что могу записывать ввод с помощью Keyboard.GetState()
, когда использую эмулятор и клавиатуру, но у реальных пользователей будут физические устройства, и мне нужно открыть экранную клавиатуру, чтобы они могли вводить информацию. Я не вижу ничего в какой-либо документации, описывающей это, но трудно поверить, что я первый, кто столкнулся с этим. Я просмотрел документацию Xamarin/Monogame по входу. и я прочитал эту статью StackOverflow. Дайте мне знать, если вам нужна дополнительная информация, чтобы решить эту проблему. Заранее благодарю за любую помощь.
Открыть экранную клавиатуру для Xamarin/Monogame
Ответы (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 справляется с этой задачей», мне стало легче находить ответы. Удачи!
KeyPress
моего View
, чтобы оно заработало. MainGame g = new MainGame(); var v = (View)g.Services.GetService(typeof(View)); v.KeyPress += OnKeyPress;
- person user2475983; 25.11.2018