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文档说:

由于软输入法可以使用多种创造性的文本输入方式,因此无法保证软键盘上的任何按键都会产生按键事件:这由 IME 自行决定,实际上不鼓励发送此类事件。您永远不应该依赖接收 KeyEvents 来获取软输入法上的任何键。特别是,默认的软件键盘永远不会向任何针对 Jelly Bean 或更高版本的应用程序发送任何键事件,并且只会向针对 Ice Cream Sandwich 或更早版本的应用程序发送某些按下删除键和返回键的事件。

但实际上,除了 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 回答
0

尝试在 KEYCODE_DEL 上捕获“输入”事件。

$('#textBox').on('input', function(event) {
    console.log(event, event.keyCode, event.which);
    // it will capture the event, but you will not get the event.keyCode 
    // and event.which.
});

有关更多详细信息 - backSpace 未在 android mobileJQuery 中触发 keyup 事件:检测输入字段中的更改

于 2015-05-28T04:32:12.230 回答