Мне нужно прослушать нажатия клавиш для своего рода эмуляции терминала. Поэтому у меня нет EditText
. Но я успешно нерест мягкую клавиатуруЗапрос ключа ввода не работает в программных клавиатурах Android
public class Click implements View.OnClickListener
{
@Override
public void onClick (View view)
{
CursorText terminal = (CursorText) findViewById (R.id.term_window);
InputMethodManager manager;
manager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);
manager.showSoftInput (terminal, InputMethodManager.SHOW_FORCED);
}
}
Переменная terminal
здесь является экземпляром пользовательского класса CursorText
, который является производным от TextView
. Он имеет атрибут android:textIsSelectable="true"
, так что он принимает клики. В противном случае он имеет android:imeOptions="flagNoExtractUi|flagForceAscii"
, но они, похоже, не имеют никакого пагубного эффекта.
Моя проблема теперь получает нажатия клавиш. Обследование документации API выглядит так, как будто нет надежного способа, так как в любой соответствующей документации указано, что классы и методы, которые он описывает, работают только для аппаратных клавиатур! Но должен быть способ.
Я пробовал несколько подходов, с onKeyListener
, onKeyPreIme
и т. Д., Большинство не реагирует вообще. Например, onKeyPreIme
необходимо переопределить в классе, производном от View
, в моем случае очевидным выбором является класс terminal
. Это не EditText
, и, возможно, именно поэтому onKeyPreIme
никогда не вызывается. Я считаю, что я не могу использовать TextWatcher
в моем случае по той же причине.
Лучший результат до сих пор от переопределения onKeyDown
в деятельности. Этот метод вызывается почти для каждого ключа, включая Backspace; единственным исключением является один наиболее важный ключ, клавиша Enter (Return). У меня такое чувство, что какой-то другой метод прослушивателя вызывается перед моим и обрабатывает, но не проходит, события Enter key. Я не знаю, как узнать.
Другая проблема, с которой я столкнулся с onKeyDown
, заключается в том, что она не генерирует автоматическое повторение при удерживании ключа. Потому что кажется, что только KeyEvent.ACTION_DOWN
, но нет KeyEvent.ACTION_UP
, я не могу создать авто-повтор сам.
Думаю, что я мог бы жить без автоматического повтора, но без клавиши Enter это шоу-стоппер. Итак, как мне разблокировать ключевые события? Что мешает onKeyDown
быть вызванным, когда я нажимаю Enter? Или, альтернативно, должен ли я пойти совершенно иначе, чтобы слушать нажатия клавиш?
BTW. Я тестирую Lollipop и Kitkat, как CM на реальном оборудовании, так и vintage-Google-Android на эмуляторе, пытаясь поддержать Jelly Bean и позже.