Enter Key Management in Libgdx TextField

I set a scene with three TextFields in my libgdx application and I get different behavior in desktop mode and in android mode. On Android, by typing the enter key, the cursor moves to the next text screen. On the desktop, entering the enter key does nothing.

How can I make the cursor move sequentially on both platforms? I want to be able to set focus to another field when the user is entered. On Android, no matter what I set the focus to, the default behavior enters the key and then puts the focus in the field after that.

Here is the code I'm currently using to move the cursor and clear the next field:

    stage.addListener(new InputListener() {
        @Override
        public boolean keyUp(InputEvent event, int keycode) {
            if (keycode == Input.Keys.ENTER) {
                nextField();
            }
            return false;
        }
    });
    Gdx.input.setInputProcessor(stage);
}

private void nextField() {
    TextField nextField = 
            stage.getKeyboardFocus() == text1
            ? text2
            : stage.getKeyboardFocus() == text2
            ? text3
            : text1;
    nextField.setText("");
    stage.setKeyboardFocus(nextField);
}

true , .

GitHub.

+4
3

TextField InputListener, . , , keyTyped :

public boolean keyTyped (InputEvent event, char character) {
     [...]
     if ((character == TAB || character == ENTER_ANDROID) && focusTraversal)
         next(Gdx.input.isKeyPressed(Keys.SHIFT_LEFT) || Gdx.input.isKeyPressed(Keys.SHIFT_RIGHT));
     [...]
}

com.badlogic.gdx.scenes.scene2d.ui.TextFieldListener, :

TextField textField
textField.setFocusTraversal(false);
textField.setTextFieldListener(new TextFieldListener() {
    @Override
    public void keyTyped(TextField textField, char key) {
        if ((key == '\r' || key == '\n')){
            textField.next(Gdx.input.isKeyPressed(Keys.SHIFT_LEFT) || Gdx.input.isKeyPressed(Keys.SHIFT_RIGHT));
        }
    }
});

TextFields setFocusTraversal, , InputListener , TextField ( ):

class MyTextField extends TextField{

class InputWrapper extends InputListener{
    private final InputListener l;

    public InputWrapper(InputListener l) {
        super();
        this.l = l;
    }

    @Override
    public boolean handle(Event e) {
        return l.handle(e);
    }

    @Override
    public boolean touchDown(InputEvent event, float x, float y,
            int pointer, int button) {
        return l.touchDown(event, x, y, pointer, button);
    }

    @Override
    public void touchUp(InputEvent event, float x, float y,
            int pointer, int button) {
        l.touchUp(event, x, y, pointer, button);
    }

    @Override
    public void touchDragged(InputEvent event, float x, float y,
            int pointer) {
        l.touchDragged(event, x, y, pointer);
    }

    @Override
    public boolean mouseMoved(InputEvent event, float x, float y) {
        return l.mouseMoved(event, x, y);
    }

    @Override
    public void enter(InputEvent event, float x, float y, int pointer,
            Actor fromActor) {
        l.enter(event, x, y, pointer, fromActor);
    }

    @Override
    public void exit(InputEvent event, float x, float y, int pointer,
            Actor toActor) {
        l.exit(event, x, y, pointer, toActor);
    }

    @Override
    public boolean scrolled(InputEvent event, float x, float y,
            int amount) {
        return l.scrolled(event, x, y, amount);
    }

    @Override
    public boolean keyDown(InputEvent event, int keycode) {
        return l.keyDown(event, keycode);
    }

    @Override
    public boolean keyUp(InputEvent event, int keycode) {
        return l.keyUp(event, keycode);
    }
    @Override
    public boolean keyTyped(InputEvent event, char character) {
        if (isDisabled()) {
            return false;
        } else if ((character == '\r' || character == '\n')){
            next(Gdx.input.isKeyPressed(Keys.SHIFT_LEFT) || Gdx.input.isKeyPressed(Keys.SHIFT_RIGHT));
            return true;
        }
        return l.keyTyped(event, character);
    }

}

public MyTextField(String text, Skin skin, String styleName) {
    super(text, skin, styleName);
}

public MyTextField(String text, Skin skin) {
    super(text, skin);
}

public MyTextField(String text, TextFieldStyle style) {
    super(text, style);
}

boolean initialized = false;
@Override
public boolean addListener (EventListener l) {
    if (!initialized) {
        if (!(l instanceof InputListener)) {
            throw new IllegalStateException();
        }
        initialized = true;
        return super.addListener(new InputWrapper((InputListener) l));
    }
    return super.addListener(l);
}
}

, , setFocusTraversal TextField / .

+3

, - , .

, , , , . MainActivity Android Main . GitHub.

private void nextField() {
    TextField nextField = 
            stage.getKeyboardFocus() == text1
            ? text2
            : stage.getKeyboardFocus() == text2
            ? text3
            : text1;
    nextField.setText("");
    if ( ! isFocusMovedAutomatically) {
        stage.setKeyboardFocus(nextField);
    }
}
0

In gdx-1.9.4, I was able to do the following:

final TextField newMessageTextField = new TextField("", uiSkin){
    @Override
    protected InputListener createInputListener () {
        return new TextFieldClickListener(){
            @Override
            public boolean keyUp(com.badlogic.gdx.scenes.scene2d.InputEvent event, int keycode) {
                System.out.println("event="+event+" key="+keycode);
                return super.keyUp(event, keycode);
            };
        };
    }
};

After clicking the arrows with focus on the TextField, I have

event=keyUp key=19
event=keyUp key=20
event=keyUp key=22
event=keyUp key=21
0
source

Source: https://habr.com/ru/post/1523821/


All Articles