#android #focus #keyevent
#Android #фокус #ключевое событие
Вопрос:
В моем случае я обязан перехватывать все ключевые события до того, как они будут отправлены в target. Итак, я установил KeyListener для каждого представления или виджета, Activity.OnKey не может удовлетворить меня в этом случае.
Однако я обнаружил, что если view (например, RelativeLayout) не является фокусируемым, он не получит никакого ключевого события. И я также получил следующие предупреждения
WARN /KeyCharacterMap (312): нет клавиатуры для идентификатора 0
WARN /KeyCharacterMap (312): используется ключевая карта по умолчанию: /system/usr/keychars/qwerty.kcm.bin
Если я принудительно настроил view на фокусировку, он получит KeyEvent. Мне любопытно об этом явлении. Я понятия не имею, отправляет ли система KeyEvents для просмотра, который является несфокусируемым, или просто я использовал неправильный способ перехвата ключевых событий.
Ответ №1:
Для этого используйте dispatchKeyEvent
(см. http://developer.android.com/reference/android/view/Window .Обратный вызов.html#dispatchKeyEvent(android.view.Ключевое событие)) для действия. Это должно получать каждое ключевое событие. Вы можете внести любые изменения, а затем вызвать super.dispatchKeyEvent
, если хотите, чтобы заработала стандартная обработка.
Комментарии:
1. Это должно сработать, но я не хочу перехватывать все ключевые события всей активности, просто ViewGroup внутри Activity. Я не могу сказать, является ли это той ViewGroup в dispatchKeyEvent. На данный момент я хотел бы попробовать настроить фокусировку всех представлений, но я не знаю, есть ли у этого побочный эффект. Похоже, что невозможно перехватить все ключевые события на уровне ViewGroup.
2. Ну, ваше желание не перехватывать все события из соображений производительности или потому, что вы беспокоитесь, что это повлияет на поведение по умолчанию? Если вы вызовете
super.dispatchKeyEvent
для всех событий для неинтересных вам представлений, вы получите поведение по умолчанию, и производительность не должна быть проблемой (если только у вас нет кого-то, кто печатает ДЕЙСТВИТЕЛЬНО ОЧЕНЬ быстро :)).3. Не из-за проблем с производительностью, просто для целей дизайна. Может быть, я не заставил себя выйти ясно, я просто хочу отслеживать одну ViewGroup внутри activity. Я понял вашу идею. Спасибо.