感谢前面的任何帮助。我会提前承认我的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()方法。
有人可以提出方法或参考吗?我发现只有这样的其他几个问题,而且它们都没有答案。似乎没有多少人在创建自己的文本编辑框,需要为他们实现后端,但这基本上就是我需要做的。
答案 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。不要忘记测试市场上的其他键盘。