我正在使用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获取文本输入?
答案 0 :(得分:1)
您可以使用MonoGames KeyboardInput.Show
方法。
var name = await KeyboardInput.Show("Name", "What's your name?", "Player");
如果您需要自己执行此操作,请查看上述方法的Android源代码。在此file中称为PlatformShow
:
来源的主要观点是:
Game.Activity.RunOnUiThread(()