Получить ввод с Android EditText без изменения представления содержимого - PullRequest
0 голосов
/ 22 мая 2019

Я использую 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 без изменения вида?

1 Ответ

1 голос
/ 23 мая 2019

Вы можете использовать метод MonoGames KeyboardInput.Show.

 var name = await KeyboardInput.Show("Name", "What's your name?", "Player");

Если вам нужно сделать это самостоятельно, я бы посмотрел источник Android для вышеуказанного метода. В этом файле ) он называется PlatformShow:

Основные пункты от источника:

  1. асинхронный характер вызовов
  2. поток, в котором он запущен: Game.Activity.RunOnUiThread(()
...