Перехват события клавиши BACK не работает в режиме редактирования (TextField = Libgdx)

Я пытаюсь вызвать метод сразу после нажатия клавиши BACK. Я пытаюсь сделать это в режиме редактирования (при записи текста в TextField с помощью Scene2D, libgdx), поэтому при этом будут присутствовать кнопки клавиатуры. Используя простой InputProcessor, установленный в Stage, или даже InputMultiplexer, кажется, что он не работает в любом случае. Система каким-то образом ловит событие и возвращает 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, используемого для решения вышеуказанных проблем.


person gogonapel    schedule 04.01.2015    source источник
comment
Привет, ты как-то исправил? ловить кнопку назад, пока видна клавиатура?   -  person    schedule 11.08.2016


Ответы (3)


Что ж, это может быть самая дурацкая сумка, которая у меня когда-либо была, но я ее починил. Вам просто нужно переключаться между этапом и задним процессором в InputMultyplexer() следующим образом: InputMultiplexer Multiplexer = new InputMultiplexer(backProcessor, mStage);

Похоже, таким образом он дает приоритет backProcessor над mStage.

person Amit Klein    schedule 27.04.2015

вы можете попробовать что-то вроде: добавить прослушиватель в ваше текстовое поле следующим образом, который улавливает клавишу ввода, а затем скрывает клавиатуру, потеряв фокус. После этого вы можете поймать клавишу НАЗАД как обычно.

    textField.setTextFieldListener(new TextField.TextFieldListener() {
    public void keyTyped(TextField textField, char key) {
    if (key == '\n' || key == '\r') {
     textField.getOnscreenKeyboard().show(false);
     getStage().setKeyboardFocus(null);
    }   
   }
 }
});
person Bill Lin    schedule 17.01.2015

 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;
        }
    };

добавление слушателя сработало для меня. Принятый ответ амита не сработал в моем случае.

person Prashant    schedule 23.06.2018