
我在我的libgdx应用程序中设置了一个包含三个TextFIEld的舞台,我在桌面模式和Android模式下获得了不同的行为.在AndroID上,键入enter键会将光标移动到下一个TextFIEld.在桌面上,键入enter键不会执行任何 *** 作.
如何在两个平台上使光标一致移动?我希望能够在用户输入时将焦点设置到另一个字段.在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使用私有内部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 textFIEldtextFIEld.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,int button) { l.touchUp(event,button); } @OverrIDe public voID touchDragged(inputEvent event,int pointer) { l.touchDragged(event,pointer); } @OverrIDe public boolean mouseMoved(inputEvent event,float y) { return l.mouseMoved(event,y); } @OverrIDe public voID enter(inputEvent event,Actor fromActor) { l.enter(event,fromActor); } @OverrIDe public voID exit(inputEvent event,Actor toActor) { l.exit(event,toActor); } @OverrIDe public boolean scrolled(inputEvent event,int amount) { return l.scrolled(event,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;@OverrIDepublic 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中输入密钥处理全部内容,希望文章能够帮你解决java – 在Libgdx TextField中输入密钥处理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)