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

无法在Android 4.1.1中的WebView上接收KEYCODE_DEL,android,android-4.2-jelly-bean,Android,Android 4.2 Jelly Bean,我想通过创建复杂的javascript来处理键盘事件,从而使WebView可编辑。除了4.1之外,所有Android版本都可以正常工作。 在4.1中,我可以处理除KeyEvent.keycodel之外的所有关键事件。似乎我们无法在安卓4.1中处理WebView的keycodel事件?如果有人能在这个问题上帮助我,我非常感激 谢谢我认为您可以扩展webview并覆盖公共布尔onKeyPreIme(int-keyCode,KeyEvent-event事件)看起来像是一个Android bug。对我来

我想通过创建复杂的javascript来处理键盘事件,从而使
WebView
可编辑。除了4.1之外,所有Android版本都可以正常工作。 在4.1中,我可以处理除
KeyEvent.keycodel
之外的所有关键事件。似乎我们无法在安卓4.1中处理
WebView
keycodel
事件?如果有人能在这个问题上帮助我,我非常感激


谢谢

我认为您可以扩展webview并覆盖
公共布尔onKeyPreIme(int-keyCode,KeyEvent-event事件)
看起来像是一个Android bug。对我来说,一个简单的解决办法是设置

android:targetSdkVersion="15"
在您的AndroidManifest.xml中

编辑: 经过更多的研究,我现在认为这不是一个bug,而是一个故意的改变。
KeyEvent
文档说明:

因为软输入法可以使用多种创造性的输入方式 文本,不能保证软键盘上的任何按键都会 生成关键事件:这由IME自行决定,并且 不鼓励发送此类事件。你永远不应该依赖别人 接收软输入法上任意键的KeyEvents。特别地, 默认的软件键盘不会向任何用户发送任何按键事件 以Jelly Bean或更高版本为目标的应用程序,将只发送事件 对于某些应用程序,按delete键和return键 目标是冰淇淋三明治或更早

但实际上,除了Delete键外,它仍然为大多数按键发送事件。由于我确实需要所有关键事件,因此我提出了以下解决方案:

首先,创建您自己的
视图
(在我的例子中,它是从
文本视图
)派生出来的,如下所示:

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;
    }
}
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;
    }
其次,通过如下子类化
BaseInputConnection
创建
MyInputConnection

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

尝试捕获keycodel上的“输入”事件

$('#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.
});
有关更多详情,请参阅:
或者

我在4.1上收到了同样的问题。有人有什么想法吗?这似乎是4.1中的一个bug。另外,我使用的是GLSURFACHEVIEW,所以这个问题不是WebView独有的。你太棒了,这个孤独帮了我一个大忙,它不适用于API级别19,构建目标级别19。deleteSurroundingText()方法根本没有被调用(运行Android 4.3的Nexus 7 2012,默认软键盘)。Build target 19似乎也没有调用它(Nexus 7 2012 Android 4.4),这不是一个完整的解决方案。选择javascript中的所有文本似乎可以让我在第二次按backspace键时开始删除。