WebView
キーボードイベントを処理するための複雑なJavaScriptを作成して、編集可能にしたい。4.1を除くすべてのAndroidバージョンですべて正常に動作します。4.1では、を除くすべての主要なイベントを処理できますKeyEvent.KEYCODE_DEL
。Android 4.1ではKEYCODE_DEL
イベントを処理できないようですが?WebView
誰かがこの問題について私を助けてくれるなら、私は非常に感謝しています
ありがとう
WebView
キーボードイベントを処理するための複雑なJavaScriptを作成して、編集可能にしたい。4.1を除くすべてのAndroidバージョンですべて正常に動作します。4.1では、を除くすべての主要なイベントを処理できますKeyEvent.KEYCODE_DEL
。Android 4.1ではKEYCODE_DEL
イベントを処理できないようですが?WebView
誰かがこの問題について私を助けてくれるなら、私は非常に感謝しています
ありがとう
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()
メソッドをオーバーライドして、外国語の文字などのキーに関するイベントを取得できます。
webview を拡張してオーバーライドできると思いますpublic boolean onKeyPreIme(int keyCode, KeyEvent event)