我想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
文档说:
由于软输入法可以使用多种创造性的文本输入方式,因此无法保证软键盘上的任何按键都会产生按键事件:这由 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()
方法以获取有关外语字母等键的事件。
我认为您可以扩展 webview 并覆盖public boolean onKeyPreIme(int keyCode, KeyEvent event)
尝试在 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 mobile 或JQuery 中触发 keyup 事件:检测输入字段中的更改