0

感谢您的任何帮助。我会提前承认我的 Java 仍然不成熟,所以我觉得我在我的头上。我几乎整天都在寻找这个答案,并尝试了各种方法都无济于事。

我正在使用一个商业游戏引擎,它将游戏导出到具有 GLSurfaceView 类实现的 Eclipse 项目。他们有一个钩子可以将单键代码发送到游戏引擎中,用于按键和按键事件,我想使用这些钩子从 Android 键盘(软键盘或硬键盘)发送按键。

覆盖 view.onKeyUp、onKeyDown 和 onKeyMultiple 接口可以让我得到我想要做的几乎所有事情,但是当使用像 Swype 这样的 IME 时,我还有一个问题。

当我 swype 这个词时,它会出现在浮动窗口中(我相信 swype 正在绘制这个),但它不会在 onKeyUp、onKeyDown 或 onKeyMultiple 回调中出现。如果我在键盘上敲击空格或任何其他字母,我会得到 onKeyMultiple 回调,它会发送我之前输入的字符串。

我以为我可以在自己的 InputConnection 中调用 finishComposingText(),所以我覆盖了 GLSurfaceView 类中的 View.onCreateInputConnection 方法,然后在游戏引擎的 DrawFrame() 方法中调用了 finishComposingText(),它有点工作。它实际上立即通过 onKeyMultiple 回调发送了文本,但是如果我按下一个键,它会再次发送相同的文本,将其复制到我的“3D 编辑框”中。我也不喜欢每帧都调用它的想法。

我完全不知道应该采取什么方法来让 swype 结果在我 swype 后立即显示而无需按键。游戏引擎没有使用 TextView 或类似的 Android 小部件,所以我也尝试了以下操作,但没有运气:

public InputConnection onCreateInputConnection ( EditorInfo outAttrs )
{
    outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE ;
    outAttrs.inputType = InputType.TYPE_NULL;
    oInputC = new BaseInputConnection ( this, false ) ;
    return oInputC;
}

oInputC 只是一个静态变量,我可以用来调用 finishComposingText() 方法。

任何人都可以提出一种方法或参考吗?我只发现了其他几个类似的问题,而且都没有得到回答。似乎没有多少人在创建自己的文本编辑框并且需要为他们实现后端,但这基本上是我需要做的。

4

1 回答 1

1

我面临同样的问题,但我想我已经找到了解决方案。我正在检查 TextView 和 EditableInputConnection 的 android 源代码,看看它们是如何做的:事实证明这并不容易。

我想我设法用我的自定义编辑器让它正常工作。这就是我的输入连接的样子。

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        outAttrs.actionLabel = "";
        outAttrs.hintText = "";
        outAttrs.initialCapsMode = 0;
        outAttrs.initialSelEnd = outAttrs.initialSelStart = -1;
        outAttrs.label = "";
        outAttrs.imeOptions = EditorInfo.IME_ACTION_UNSPECIFIED | EditorInfo.IME_FLAG_NO_EXTRACT_UI;        
        outAttrs.inputType = InputType.TYPE_CLASS_TEXT;        
        final InputConnection in = new BaseInputConnection(this, false){
        private HudInputElement getInputElement(){...}
            @Override
        public boolean setComposingText(CharSequence text,
                int newCursorPosition) {
            B2DEngine.getLogger().info("composing text: "+text+","+newCursorPosition);
            HudInputElement input = getInputElement();
            if(input!=null){
                input.setComposingText(text.toString());
            }
            return super.setComposingText(text, newCursorPosition);
        }


        @Override
        public boolean finishComposingText() {
            HudInputElement input = getInputElement();
            if(input!=null){
                input.doneComposing();
            }
            return super.finishComposingText();
        }
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) {
            B2DEngine.getLogger().info("commit:"+text.toString()+","+this.getEditable().toString());
            HudInputElement input = getInputElement();
            if(input!=null){
                input.doneComposing();
            }
            return super.commitText(text, newCursorPosition);
        }           
        };       

        return in;
    }   

由于软输入键盘支持各种自动完成文本的方式,因此当前输入的单词会被区别对待。您必须确保在调用 setComposingText 时,您必须替换之前收到的文本。仅flag当用户按下按钮或调用 finishComposingText 或 commitText 时才清除它。

PS不要忘记测试市场上的其他键盘。

于 2014-02-01T10:47:19.813 回答