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));
}
}
});
如果您需要能够启用和使用的TextField 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和启用/禁用自己的听众做。
箭头后,我想禁用焦点遍历将完成我所需要的。谢谢。 –
它工作,我已经更新了我的[示例代码](https://github.com/donkirkby/vograbulary/blob/enter-key-traversal/vograbulary/src/com/github/donkirkby/vograbulary/VograbularyGame。java#L31)来包含它。赏金是你的。 –