java– 在Libgdx TextField中输入密钥处理

java– 在Libgdx TextField中输入密钥处理,第1张

概述我在我的libgdx应用程序中设置了一个包含三个TextField的舞台,我在桌面模式和Android模式下获得了不同的行为.在Android上,键入enter键会将光标移动到下一个TextField.在桌面上,键入enter键不会执行任何 *** 作.如何在两个平台上使光标一致移动?我希望能够在用户输入时将焦点设置到另一个字段.在Android上,无论我将焦点设置

我在我的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中输入密钥处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1140405.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存