Главная » Разработка для Android » Слушание событий клавиатуры – программирование Android

0

 

Обработка ввода с клавиатуры, пригодная для использования на нескольких платформах, реализуется непросто. На некоторых устройствах гораздо больше кнопок, чем на других, некоторые требуют тройного щелчка для символьного ввода и т. д. Трейной щелчок – отличный пример функционала, который нужно по возможности реализовывать во фреймворке, в классе EditText или каком-либо его подклассе.

Чтобы дополнить функционал виджета по обработке событий клавиатуры KeyEvent, используется метод setOnKeyListener. Он относится к виду View и устанавливает метод OnKeyListener. Слушателю будет приходить несколько событий KeyEvent при каждом пользовательском нажатии клавиши, по одному событию для каждого из трех типов действия: DOWN, UP и MULTIPLE. Типы действия DOWN и UP указывают, что клавиша была нажата или отпущена, как и в случае с классом MotionEvent. Действие типа MULTIPLE, связанное с клавишами, говорит, что клавиша удерживается (автоматический повтор ввода). Метод getRepeatCount, относящийся к событиям KeyEvent, указывает, какое количество нажатий представлено событием типа MULTIPLE.

В примере 7.10 показан образец обработчика нажатий клавиш. Если добавить этот фрагмент к демонстрационной программе, он вызывает появление на экране точек в случайных координатах. Это происходит при нажатии и отпускании клавиш. Розовая точка добавляется при нажатии и отпускании клавиши пробела, желтая точка – при нажатии и отпускании клавиши «Ввод», голубая точка – при нажатии и отпускании любой другой клавиши.

Пример 7.10. Обработка нажатий клавиш

Альтернативные способы обработки событий

Вы, вероятно, заметили, что рассмотренные до сих пор методы типа on…, относящиеся к слушателям, – в том числе метод оnКеу – возвращают булево значение (bool еаn). Такой принцип работы слушателей позволяет им контролировать последующую обработку события, производимую вызывающей стороной.

Когда событие контроллера передается виджету, код фреймворка в виджете направляет это событие в зависимости от типа события к подходящему методу: onKeyDown, onTouchEvent и т. д. Эти методы, находящиеся либо в классе View, либо в его подклассах, реализуют поведение, виджета. Но, как было описано выше, сначала фреймворк предлагает событие подходящему слушателю (onTouchListener, onKeyListener и т. д.), если таковой существует. Значение, возвращаемое слушателем, определяет, будет ли событие затем направлено к методам класса View.

Если слушатель возвращает false, то событие направляется к методам View, так как обработчик не существует. Если же, напротив, слушатель возвращает true, то принято говорить, что событие потребляется (consumed). Класс View отменяет всяческую его дальнейшую обработку. Методы View никогда не вызываются применительно к потребленному событию, не могут его обрабатывать или отвечать на него. С точки зрения методов View эта ситуация такова, как если бы события не существовало.

Итак, существует три сценария, по которым может развиваться обработка события.

Слушатель отсутствует – событие направляется к методам класса View для нормальной обработки. Реализация виджета, разумеется, может переопределять эти методы.

Слушатель существует и возвращает true – обработка события слушателем полностью заменяет обычную обработку события виджетом. Событие никогда не направляется к View.

Слушатель существует и возвращает false – событие обрабатывается сначала слушателем, а затем – классом View. После того как слушатель завершит обработку события, событие передается к View для обычной обработки. Рассмотрим, например, что бы произошло, если бы слушатель нажатий на клавиши из примера 7.10 был добавлен к виджету EditText. Поскольку метод onКеу всегда возвращает true, фреймворк отменит любую дальнейшую обработку события KeyEvent сразу после того, как метод вернет значение. Поэтому механизм обработки нажатий клавиш из Edi tText даже не будет видеть нажатий клавиши и в текстовых полях так и не появится никакого текста. Очевидно, такое поведение нас не устраивает!

Если же, напротив, метод опКеу вернет false для некоторых нажатий клавиш, то фреймворк диспетчирует эти события виджету Edi tText для дальнейшей обработки. Механизм EditText увидит эти события, и связанные с ними символы будут добавлены в поле EditText, как и ожидается. В примере 7.11 показан дополненный код из примера 7.10. Теперь мы не только добавляем новые точки в модель, но и фильтруем символы, добавляемые в поле EditText. Таким образом, мы добиваемся нормальной обработки числовых символов, а любые другие символы не отображаются.

Пример 7.11. Дополненная обработка нажатий на клавиши

Если в вашем приложении требуется реализовать совершенно новые способы обработки событий – которым недостаточно простого дополнения поведений и фильтрации при помощи onKeyHandler, – то придется разобраться в механизме обработки нажатий клавиш, применяемом в классе View, и переопределить этот механизм. В общем виде процесс выглядит так: события направляются к классу View посредством метода DispatchKeyEvent. Метод DispatchKeyEvent реализует поведение, описанное выше, предлагая событие сначала методу onKeyHandler, а потом, если обработчик вернет false, – методам класса View, реализующим интерфейс KeyEvent. Callback. Это методы onKeyDown, onKeyUp и onKeyMultiple.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии