【问题标题】:LibGDX - how to catch a backbutton inside a TextField with Android Keyboard visible?LibGDX - 如何在 Android 键盘可见的 TextField 内捕捉后退按钮?
【发布时间】:2016-08-10 17:51:40
【问题描述】:

我试图在 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”是没有任何“字符代码”的一个键,因此无法在此处捕获:

public void keyTyped(TextField textField, char c)

最终编辑

正如 LibGDX 作者所说 - 无法以正常方式检索它,因为当键盘可见时按下后退按钮时,它会在应用程序之外进行处理。 Android解决方案是覆盖EditTextonPreKeyIme(),但是LibGDX TextField与Android的无关,没有任何联系。

如果有人能指出任何解决此问题的方法,我将不胜感激。

【问题讨论】:

    标签: android input libgdx android-softkeyboard back-button


    【解决方案1】:

    使用本教程重写您的 GDX Launcher 类: 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);
                }
            };
    

    【讨论】:

      【解决方案2】:

      答案是 - 不可能。键盘处于活动状态时,Android 不会捕捉后退按钮。哈。他们甚至没有办法检查软键盘是否可见,并且有一些技巧可以捕捉它的视图高度(它给出了键盘高度),这也会使一切都出错,因为它与导航/状态栏等其他 ui 组件发生冲突和整个沉浸式模式。

      我希望有一天 Google 开发人员会在这里查看,检查并考虑在 6 年后修复此问题,因为我们在 2016 年,您正在修复代码样式而不是最重要的跟踪器上发布的关键错误来自这里的编码器。

      【讨论】:

        【解决方案3】:

        在 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-27
          • 2013-05-15
          • 2023-03-22
          • 2012-06-04
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          相关资源
          最近更新 更多