Я нашел обходной путь, показав программную клавиатуру при нажатии кнопки и переопределив dispatchKeyEvent в Activity для захвата нажатий клавиш.Мне не нужен был EditText, и мне не требовалось показывать программную клавиатуру.
Это отображение программной клавиатуры:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
Это dispatchKeyEvent:
public boolean dispatchKeyEvent(KeyEvent event) {
/**
* ACTION_MULTIPLE is for keys with special characters like ©
* British Pound sign etc. These keys do not generate the ACTION_DOWN
* or ACTION_UP events.
*
* Only the ACTION_DOWN is handled. ACTION_UP is ignored to avoid
* duplication of the letters that the user wants to type.
*/
if (event.getAction() == KeyEvent.ACTION_DOWN ||
event.getAction() == KeyEvent.ACTION_MULTIPLE) {
DrawView dview = (DrawView) findViewById(R.id.draw_view);
Log.v(LOG_TAG, "c = " + event.getKeyCode() +
", l = " + event.getDisplayLabel() +
", u = " + event.getUnicodeChar() +
", uc = " + (char)event.getUnicodeChar() +
", chars = " + event.getCharacters()
);
dview.addText(event);
}
return true;
}
Это метод addText, в котором обрабатывается соответствующее событие:
public void addText(KeyEvent event) {
int unicode = event.getUnicodeChar();
int keycode = event.getKeyCode();
String characters = event.getCharacters();
if (unicode == 0) {
switch (keycode) {
case 0:
if (characters != null) {
text += characters;
}
break;
case KeyEvent.KEYCODE_DEL:
text = text.substring(0, text.length()-1);
break;
case KeyEvent.KEYCODE_SHIFT_LEFT:
case KeyEvent.KEYCODE_SHIFT_RIGHT:
// ignore, nothing to do
break;
}
}
else {
text = text + (char)unicode;
}
invalidate();
}
Это сообщения, которые указывают мне правильное направление: Как захватить ввод с программной клавиатуры вВид? Можно ли использовать программную клавиатуру без EditText?