gpt4 book ai didi

java - 在 Libgdx TextField 中输入键处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:46:03 24 4
gpt4 key购买 nike

我在我的 libgdx 应用程序中设置了一个包含三个 TextField 的舞台,我在桌面模式和 Android 模式下获得了不同的行为。在 Android 上,键入回车键会将光标移动到下一个 TextField。在桌面上,键入回车键没有任何作用。

如何使光标在两个平台上一致地移动?我希望能够在用户输入时将焦点设置到另一个字段。在 Android 上,无论我将焦点设置到什么位置,默认的回车键行为都会将焦点跳转到之后的字段。

这是我目前用来移动光标和清除下一个字段的代码:

    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,但在我的代码完成后焦点仍然移动。

我的完整示例代码是 on GitHub .

最佳答案

TextField 使用一个私有(private)的内部 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 时将内部 InputListener 包装在您自己的监听器中(但我会 推荐这个):

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

编辑:再想一想,您也可以通过简单地覆盖 TextField 的 setFocusTraversal 并在调用此方法期间启用/禁用您自己的监听器来使用第一个解决方案来做到这一点。

关于java - 在 Libgdx TextField 中输入键处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com