Изглежда като грешка в 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()
, за да получите събития за ключове на букви на чужд език и т.н.
person
Lior Hass
schedule
28.02.2013