在编辑模式下捕获 BACK 键事件不起作用(TextField = Libgdx)
Catching BACK key event not working while in Edit Mode (TextField = Libgdx)
我正在尝试在按下 BACK 键后立即调用一个方法。我试图在编辑模式下执行此操作(当使用 Scene2D 、libgdx 将文本写入 TextField 时),因此当我执行此操作时键盘按钮将出现。使用设置为舞台的简单 InputProcessor,或什至 InputMultiplexer,似乎这两种方式都不起作用。在系统键盘从屏幕上消失后,系统以某种方式捕获事件和 returns false。
使用的第一种方法:
@Override
public void create() {
...
Gdx.input.setCatchBackKey(true);
...
}
@Override
public boolean keyDown(int keycode) {
...
if(keycode == Keys.BACK){
// Optional back button handling (e.g. ask for confirmation)
...
if (shouldReallyQuit)
Gdx.app.exit();
}
return false;
}
使用的第二种方法:
InputProcessor backProcessor = new InputAdapter() {
@Override
public boolean keyDown(int keycode) {
if ((keycode == Keys.ESCAPE) || (keycode == Keys.BACK))
// Some code
return false;
}
};
InputMultiplexer multiplexer = new InputMultiplexer(mStage,
backProcessor);
Gdx.input.setInputProcessor(multiplexer);
这可能是什么问题?
另外,TextField 文本框没有setOnEditorActionListener 方法来解决上述问题。
您可以尝试以下方法:
如下所示将侦听器添加到您的 textField,它捕获回车键,然后隐藏键盘失去焦点。之后就可以正常接BACK键了
textField.setTextFieldListener(new TextField.TextFieldListener() {
public void keyTyped(TextField textField, char key) {
if (key == '\n' || key == '\r') {
textField.getOnscreenKeyboard().show(false);
getStage().setKeyboardFocus(null);
}
}
}
});
好吧,这可能是我有过的最愚蠢的包,但我修好了。你只需要像这样在 InputMultiplexer() 中的阶段和后台处理器之间切换:
InputMultiplexer 多路复用器 = new InputMultiplexer(backProcessor, mStage);
似乎是这样让 backProcessor 优先于 mStage。
private EventListener textListener = new EventListener() {
@Override
public boolean handle(Event event) {
if (event instanceof InputEvent) {
if (((InputEvent) event).getType() == InputEvent.Type.keyDown && ((InputEvent) event).getKeyCode() == Input.Keys.BACK) {
((TextField)event.getListenerActor()).getOnscreenKeyboard().show(false);
stage.setKeyboardFocus(null);
}
}
return false;
}
};
添加监听器对我有用。阿米特接受的答案对我不起作用。
我正在尝试在按下 BACK 键后立即调用一个方法。我试图在编辑模式下执行此操作(当使用 Scene2D 、libgdx 将文本写入 TextField 时),因此当我执行此操作时键盘按钮将出现。使用设置为舞台的简单 InputProcessor,或什至 InputMultiplexer,似乎这两种方式都不起作用。在系统键盘从屏幕上消失后,系统以某种方式捕获事件和 returns false。
使用的第一种方法:
@Override
public void create() {
...
Gdx.input.setCatchBackKey(true);
...
}
@Override
public boolean keyDown(int keycode) {
...
if(keycode == Keys.BACK){
// Optional back button handling (e.g. ask for confirmation)
...
if (shouldReallyQuit)
Gdx.app.exit();
}
return false;
}
使用的第二种方法:
InputProcessor backProcessor = new InputAdapter() {
@Override
public boolean keyDown(int keycode) {
if ((keycode == Keys.ESCAPE) || (keycode == Keys.BACK))
// Some code
return false;
}
};
InputMultiplexer multiplexer = new InputMultiplexer(mStage,
backProcessor);
Gdx.input.setInputProcessor(multiplexer);
这可能是什么问题?
另外,TextField 文本框没有setOnEditorActionListener 方法来解决上述问题。
您可以尝试以下方法: 如下所示将侦听器添加到您的 textField,它捕获回车键,然后隐藏键盘失去焦点。之后就可以正常接BACK键了
textField.setTextFieldListener(new TextField.TextFieldListener() {
public void keyTyped(TextField textField, char key) {
if (key == '\n' || key == '\r') {
textField.getOnscreenKeyboard().show(false);
getStage().setKeyboardFocus(null);
}
}
}
});
好吧,这可能是我有过的最愚蠢的包,但我修好了。你只需要像这样在 InputMultiplexer() 中的阶段和后台处理器之间切换: InputMultiplexer 多路复用器 = new InputMultiplexer(backProcessor, mStage);
似乎是这样让 backProcessor 优先于 mStage。
private EventListener textListener = new EventListener() {
@Override
public boolean handle(Event event) {
if (event instanceof InputEvent) {
if (((InputEvent) event).getType() == InputEvent.Type.keyDown && ((InputEvent) event).getKeyCode() == Input.Keys.BACK) {
((TextField)event.getListenerActor()).getOnscreenKeyboard().show(false);
stage.setKeyboardFocus(null);
}
}
return false;
}
};
添加监听器对我有用。阿米特接受的答案对我不起作用。