在swype完成后需要IME组合文本提交

时间:2013-03-05 06:52:58

标签: android input android-softkeyboard

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

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

覆盖view.onKeyUp,onKeyDown和onKeyMultiple接口允许我获得几乎所有我想要做的事情,但是当使用类似Swype的IME时,我仍然有一个问题。

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

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

我完全迷失了我应该采取什么方法来使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()方法。

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

1 个答案:

答案 0 :(得分: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时,您必须替换以前收到的文本。当用户按下按钮或者调用finishComposingText或commitText时,只清除此flag

P.S。不要忘记测试市场上的其他键盘。