0

前もって助けてくれてありがとう。私の Java はまだ未熟であることを前もって認めておきます。私はこの答えをほぼ一日中探していましたが、さまざまなアプローチを試してみましたが役に立ちませんでした。

GLSurfaceView クラスを実装した Eclipse プロジェクトにゲームをエクスポートする商用ゲーム エンジンを使用しています。キーダウンおよびキーアップイベントのために単一のキーコードをゲームエンジンに送信するフックがあり、これらのフックを使用して Android キーボード (ソフトまたはハード) からキーを送信したいと考えています。

view.onKeyUp、onKeyDown、および onKeyMultiple インターフェイスをオーバーライドすることで、やりたいことのほとんどすべてを実現できますが、Swype のような IME を使用すると、まだ 1 つの問題が残っています。

単語をスワイプすると、フローティング ウィンドウに表示されますが (スワイプがこれを描画していると思います)、onKeyUp、onKeyDown、または onKeyMultiple コールバックでは表示されません。キーボードでスペースまたはその他の文字を押すと、以前にスワイプした文字列を送信する onKeyMultiple コールバックを取得します。

自分の InputConnection で finishComposingText() を呼び出すだけでよいと思ったので、GLSurfaceView クラスの View.onCreateInputConnection メソッドをオーバーライドしてから、ゲーム エンジンの DrawFrame() メソッドで finishComposingText() を呼び出したところ、ある程度機能しました。実際にはすぐに onKeyMultiple コールバックを介してテキストを送信しましたが、キーを押すと、同じテキストが再度送信され、「3D 編集ボックス」に複製されました。また、すべてのフレームでそれを呼び出すという考えも好きではありませんでした。

キーを押さなくてもスワイプした直後にスワイプの結果を表示するためにどのようなアプローチをとるべきか、私は完全に迷っています。ゲーム エンジンは 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() メソッドを呼び出すために使用できる単なる静的変数です。

誰かがアプローチや参照を提案できますか? このような質問は他に 2、3 しか見つかりませんでしたが、どちらも未回答でした。独自のテキスト編集ボックスを作成し、そのバックエンドを実装する必要がある人はあまりいないようですが、それは基本的に私が行う必要があることです。

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 に答える