2016-07-07 14 views
0

Мне нужно прослушать нажатия клавиш для своего рода эмуляции терминала. Поэтому у меня нет 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 и позже.

ответ

0

SOFT-клавиатуры редко создают ключевые события. Обычно они работают, вызывая inputConnection.commitText, который принимает целую строку за раз. Чтобы сделать то, что вы хотите, вам нужно связать InputMethod с представлением и переопределить onCreateInputConnection представления, чтобы вернуть пользовательский InputConnection, который может корректно обрабатывать commitText.