3

WebViewキーボードイベントを処理するための複雑なJavaScriptを作成して、編集可能にしたい。4.1を除くすべてのAndroidバージョンですべて正常に動作します。4.1では、を除くすべての主要なイベントを処理できますKeyEvent.KEYCODE_DEL。Android 4.1ではKEYCODE_DELイベントを処理できないようですが?WebView誰かがこの問題について私を助けてくれるなら、私は非常に感謝しています

ありがとう

4

3 に答える 3

4

Androidのバグのようです。私のために働いた簡単な回避策は、設定することでした

android:targetSdkVersion="15"

AndroidManifest.xml で

編集:

さらに調査した結果、これはバグではなく、意図的な変更であると考えています。KeyEventドキュメントには次のように記載されています。

ソフト入力メソッドはテキストを入力する複数の独創的な方法を使用できるため、ソフト キーボードでキーを押してもキー イベントが生成されるという保証はありません。ソフト入力メソッドのキーの KeyEvents の受信に依存しないでください。特に、デフォルトのソフトウェア キーボードは、Jelly Bean 以降を対象とするアプリケーションにキー イベントを送信することはなく、Ice Cream Sandwich 以前を対象とするアプリケーションに対しては、delete キーと return キーの一部の押下に対するイベントのみを送信します。

ただし、実際には、Delete キーを除くほとんどのキーの押下に対してイベントを送信します。すべての重要なイベントが本当に必要だったので、次の解決策を思い付きました。

まず、次のように独自のものを作成しますView(私の場合はから派生しましたTextView):

public class MyTextView extends TextView {

  ...

    @Override
    public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
        editorInfo.actionLabel = null;
        editorInfo.inputType   = InputType.TYPE_NULL;
        editorInfo.imeOptions  = EditorInfo.IME_ACTION_NONE;

        return new MyInputConnection(this, false);
    }

    @Override
    public boolean onCheckIsTextEditor() {
        return true;
    }
}

次に、次のようMyInputConnectionにサブクラス化して作成します。BaseInputConnection

public class MyInputConnection extends BaseInputConnection { 

    ...


    // From Android 4.1 this is called when the DEL key is pressed on the soft keyboard (and
    // sendKeyEvent() is not called). We convert this to a "normal" key event.
    @Override
    public boolean deleteSurroundingText(int beforeLength, int afterLength) {
        long eventTime = SystemClock.uptimeMillis();
        sendKeyEvent(new KeyEvent(eventTime, eventTime,
                KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE | KeyEvent.FLAG_EDITOR_ACTION));
        sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
                KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE | KeyEvent.FLAG_EDITOR_ACTION));
        return true;
    }

あなたのInputConnectionクラスでは、何が起こっているのかをうまくコントロールできます。たとえば、commitText()メソッドをオーバーライドして、外国語の文字などのキーに関するイベントを取得できます。

于 2013-02-28T10:12:19.293 に答える
0

webview を拡張してオーバーライドできると思いますpublic boolean onKeyPreIme(int keyCode, KeyEvent event)

于 2012-12-07T22:53:08.220 に答える