LibGDX - 如何在 Android 键盘可见的情况下捕捉 TextField 中的后退按钮?
LibGDX - how to catch a backbutton inside a TextField with Android Keyboard visible?
我正在尝试在 TextField 处于焦点(键盘可见)时捕捉“后退”按钮。
我已经尝试过 Multiplexer
- 在舞台顶部设置“BackProcessor
” - 它不起作用:
InputProcessor backProcessor = new InputAdapter() {
@Override
public boolean keyDown(int keycode) {
if ((keycode == Input.Keys.BACK) )
{
Gdx.app.log("INPUT", "BACK");
}
return false;
}
};
InputMultiplexer multiplexer = new InputMultiplexer(backProcessor,
loginStage,registerStage);
Gdx.input.setInputProcessor(multiplexer);
此外,我在 render
方法中尝试使用:
if(Gdx.input.isKeyDown(Keys.BACK)
也不行。
以上解决方案完美工作除了键盘可见的那一刻。
我想达到什么目的?
当 onScreenKeyboard 可见时,我需要抓住后退按钮。
编辑
我也试过 TextFieldListener
但是 'BackButton' 是一个没有任何 'char code' 的键,所以它不能在那里被捕获:
public void keyTyped(TextField textField, char c)
最终编辑
正如 LibGDX 作者所说 - 无法以正常方式检索它,因为当键盘可见时按下后退按钮时,后退按钮是在应用程序外部处理的。 Android 的解决方案是覆盖 EditText
的 onPreKeyIme()
但是 LibGDX TextField
与 Android 的一个无关并且没有任何联系。
如果有人可以指出任何解决此问题的方法,我将不胜感激。
答案是——不可能。 Android 在键盘处于活动状态时无法捕获后退按钮。哈。他们甚至没有办法检查软键盘是否可见,并且有一些技巧可以捕捉到它的视图高度(它给出了键盘高度),这也会导致一切错误,因为它与其他 ui 组件发生碰撞,例如 navigation/status栏和整个沉浸式模式。
我希望有一天 Google 开发人员会看这里,检查它并考虑在 6 年后修复它,因为我们在 2016 年,你正在修复代码风格而不是严重的错误,这由此处最伟大的编码员发布在跟踪器上。
使用本教程重写您的 GDX 启动器 class:
https://github.com/libgdx/libgdx/wiki/Admob-in-libgdx
然后,您将拥有 RelativeLayout,这样您就可以覆盖 dispatchKeyEventPreIme() 方法
它将在事件发送到 IME 之前捕获事件;)
RelativeLayout layout = new RelativeLayout(this) {
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
// back pressed }
}
return super.dispatchKeyEventPreIme(event);
}
};
在 AndroidLauncher 中,而不是这样做:
initialize(new MyGdxGame(this), configuration);
这样做:
RelativeLayout layout = new RelativeLayout(this) {
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){
//here goes your code
}
return super.dispatchKeyEventPreIme(event);
}
};
View gameView = initializeForView(new MyGdxGame(this), configuration);
layout.addView(gameView);
setContentView(layout);
我正在尝试在 TextField 处于焦点(键盘可见)时捕捉“后退”按钮。
我已经尝试过 Multiplexer
- 在舞台顶部设置“BackProcessor
” - 它不起作用:
InputProcessor backProcessor = new InputAdapter() {
@Override
public boolean keyDown(int keycode) {
if ((keycode == Input.Keys.BACK) )
{
Gdx.app.log("INPUT", "BACK");
}
return false;
}
};
InputMultiplexer multiplexer = new InputMultiplexer(backProcessor,
loginStage,registerStage);
Gdx.input.setInputProcessor(multiplexer);
此外,我在 render
方法中尝试使用:
if(Gdx.input.isKeyDown(Keys.BACK)
也不行。
以上解决方案完美工作除了键盘可见的那一刻。
我想达到什么目的? 当 onScreenKeyboard 可见时,我需要抓住后退按钮。
编辑
我也试过 TextFieldListener
但是 'BackButton' 是一个没有任何 'char code' 的键,所以它不能在那里被捕获:
public void keyTyped(TextField textField, char c)
最终编辑
正如 LibGDX 作者所说 - 无法以正常方式检索它,因为当键盘可见时按下后退按钮时,后退按钮是在应用程序外部处理的。 Android 的解决方案是覆盖 EditText
的 onPreKeyIme()
但是 LibGDX TextField
与 Android 的一个无关并且没有任何联系。
如果有人可以指出任何解决此问题的方法,我将不胜感激。
答案是——不可能。 Android 在键盘处于活动状态时无法捕获后退按钮。哈。他们甚至没有办法检查软键盘是否可见,并且有一些技巧可以捕捉到它的视图高度(它给出了键盘高度),这也会导致一切错误,因为它与其他 ui 组件发生碰撞,例如 navigation/status栏和整个沉浸式模式。
我希望有一天 Google 开发人员会看这里,检查它并考虑在 6 年后修复它,因为我们在 2016 年,你正在修复代码风格而不是严重的错误,这由此处最伟大的编码员发布在跟踪器上。
使用本教程重写您的 GDX 启动器 class: https://github.com/libgdx/libgdx/wiki/Admob-in-libgdx
然后,您将拥有 RelativeLayout,这样您就可以覆盖 dispatchKeyEventPreIme() 方法 它将在事件发送到 IME 之前捕获事件;)
RelativeLayout layout = new RelativeLayout(this) {
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
// back pressed }
}
return super.dispatchKeyEventPreIme(event);
}
};
在 AndroidLauncher 中,而不是这样做:
initialize(new MyGdxGame(this), configuration);
这样做:
RelativeLayout layout = new RelativeLayout(this) {
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){
//here goes your code
}
return super.dispatchKeyEventPreIme(event);
}
};
View gameView = initializeForView(new MyGdxGame(this), configuration);
layout.addView(gameView);
setContentView(layout);