看起来像是 Android 的错误。对我有用的一个简单的解决方法是设置
android:targetSdkVersion="15"
在你的 AndroidManifest.xml 中
EDIT:
经过更多研究后,我现在认为这不是一个错误,而是一个故意的改变。这KeyEvent
文档说:
由于软输入法可以使用多种创造性的输入方式
文本,不能保证软键盘上的任何按键都会
生成一个按键事件:这由 IME 自行决定,并且
不鼓励发送此类事件。你永远不应该依赖
接收软输入法上任何键的 KeyEvents。尤其,
默认的软件键盘永远不会向任何键盘发送任何按键事件
面向 Jelly Bean 或更高版本的应用程序,并且只会发送事件
对于某些应用程序按删除键和返回键
目标是冰淇淋三明治或更早。
但实际上,除了删除键之外,它仍然会发送大多数按键事件。由于我确实需要所有关键事件,所以我想出了这个解决方案:
首先,创建自己的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;
}
In your InputConnection
课堂上你可以很好地控制正在发生的事情。例如,您可以覆盖commitText()
获取有关外文字母键等事件的方法。