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 的解决方案是覆盖 EditTextonPreKeyIme() 但是 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);