无法在Android 4.1.1中的WebView上接收KEYCODE_DEL
我想通过创建复杂的javascript来处理键盘事件,从而使无法在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。对我来
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键时开始删除。