在Android 4.1.1中无法在WebView上接收KEYCODE_DEL

时间:2012-10-04 15:26:38

标签: android android-4.2-jelly-bean

我想通过创建复杂的javascript来处理键盘事件来使WebView可编辑。除 4.1 外,所有Android版本都能正常运行。 在 4.1 中,我可以处理除KeyEvent.KEYCODE_DEL之外的所有关键事件。我们似乎无法在Android 4.1中处理KEYCODE_DEL的{​​{1}}事件?如果有人能在这个问题上帮助我,我将非常感激

由于

3 个答案:

答案 0 :(得分:4)

看起来像是一个Android错误。一个对我有用的简单解决方法是设置

android:targetSdkVersion="15"

在你的AndroidManifest.xml

修改

经过一些更多的研究,我现在认为这不是一个错误,而是一个刻意的改变。 KeyEvent文档说:

  

由于软输入法可以使用多种创造性的输入方式   文字,无法保证软键盘上的任何按键都会   生成一个关键事件:这由IME自行决定,并在   不鼓励发送此类事件的事实。你永远不应该依赖   接收软输入法上任何键的KeyEvents。特别是,   默认软件键盘永远不会向任何键事件发送任何键事件   应用程序目标是Jelly Bean或更高版本,并且只会发送事件   对于一些按下删除键和返回键到应用程序   目标冰淇淋三明治或更早。

实际上,除了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()方法以获取有关外语字母键等的事件。

答案 1 :(得分:0)

我认为您可以扩展webview并覆盖public boolean onKeyPreIme(int keyCode, KeyEvent event)

答案 2 :(得分: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 not firing the keyup event in android mobileJQuery: detect change in input field