从Android EditText获取输入,而无需更改内容视图

时间:2019-05-22 18:43:54

标签: c# android xamarin android-edittext monogame

我正在使用Monogame和Xamarin为Android创建游戏。我面临的一个主要问题是准确地从软键盘获取键盘输入。我试图将文本放入EditText,然后使用处理程序将文本转发到游戏中的文本框。我遇到的问题是,要从EditText获取键盘输入,我必须更改ContentView,这将使游戏不再可见。

我发现有几部较旧的电话无法正确响应Activity中的OnKeyUp或DispatchKeyEvent方法(即,退格键不起作用或出现滞后,并且有时某些键不能很好地响应)。我还直接从视图中尝试了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 个答案:

答案 0 :(得分:1)

您可以使用MonoGames KeyboardInput.Show方法。

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

如果您需要自己执行此操作,请查看上述方法的Android源代码。在此file中称为PlatformShow

来源的主要观点是:

  1. 调用的异步性质
  2. 运行它的线程:Game.Activity.RunOnUiThread(()