Я использую Monogame и Xamarin для создания игры для Android.Основная проблема, с которой я сталкиваюсь, - это точный ввод с программной клавиатуры.Я пытаюсь поместить текст в EditText, а затем использую обработчик для пересылки текста в текстовое поле в игре.Проблема, с которой я столкнулся, заключается в том, что для получения ввода с клавиатуры из EditText я должен изменить ContentView, что делает игру более невидимой.
Я обнаружил, что несколько старых телефонов неправильно реагируют на методы OnKeyUp или DispatchKeyEvent в Activity (т. Е. Backspace не работает или имеет задержку, и часто некоторые клавиши не отвечают должным образом).Я также попробовал KeyListener непосредственно из представления, но это также вызвало задержку в некоторых ключах.
В основном упражнении я установил ContentView в Game:
protected override void OnCreate(Bundle bundle)
{
_game = new Game1();
SetContentView((View)_game.Services.GetService(typeof(View)));
var inputMethodManager = (InputMethodManager)this.Application.GetSystemService("input_method");
var textWatcher = new TextWatcher(_game, this, inputMethodManager);
}
Затем, когдаЯ показываю программную клавиатуру, у меня есть этот код в моем классе TextWatcher, который реализует интерфейс ITextWatcher:
public void ShowKeyboard(object sender, string e)
{
if (this._inputMethodManager.IsAcceptingText)
return;
_layout = new LinearLayout(_activity);
//Without this line, the TextWatcher does not capture input text. But with this code, it takes the view away from the game
_activity.SetContentView(_layout);
var orientation = _activity.RequestedOrientation;
if (orientation == ScreenOrientation.Portrait || orientation == ScreenOrientation.ReversePortrait)
_layout.Orientation = Android.Widget.Orientation.Vertical;// (LinearLayout.VERTICAL);
else
_layout.Orientation = Android.Widget.Orientation.Horizontal;// (LinearLayout.VERTICAL);
//Add the EditText to the layout
_layout.AddView(_textEditor);
_textEditor.RequestFocus();
if (!string.IsNullOrEmpty(e))
{
_textEditor.Text = e;
_textEditor.SelectAll();
}
_inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
}
Как получить ввод текста из EditText без изменения вида?