- KeyboardView — создаём свою клавиатуру
- Создание своей клавиатуры для android
- Создание пользовательской клавиатуры на Android
- 1. Предпосылки
- 2. Создать новый проект
- 3. Отредактируйте манифест
- 4. Создайте метод.
- 5. Редактирование строк.xml
- 6. Определите макет клавиатуры
- 6. Определите клавиши клавиатуры
- 7. Создание класса Service
- 8. Тестирование клавиатуры
KeyboardView — создаём свою клавиатуру
5-й курс/Закрытая зона
Когда мы хотим ввести какие-то данные в текстовые поля, то обычно используем клавиатуры, которые установлены в системе. По сути, клавиатура — это обычное приложение в формате APK. Как правило, в системе уже установлена системная клавиатура, также может стоять клавиатура от производителя аппарата, и можно загрузить отдельную клавиатуру с Google Play.
В большинстве случаев установленных клавиатур достаточно для ввода текста и чисел. Они обладают определённой гибкостью и могут подстраиваться под конкретное текстовое поле, выводя клавиши с цифрами, если нужно набрать телефонный номер и т.д.
Тем не менее, может возникнуть такая ситуация, когда понадобится свой вид клавиатуры. Допустим, мы хотим иметь клавиатуру для ввода шестнадцатиричных чисел с клавишами от 0-9 и A, B, C, D, F. Значит нам придётся разработать собственную клавиатуру.
Стоит отметить, что стандартные клавиатуры работают как сервисы и доступны для всех приложений. Мы же напишем упрощённый вид клавиатуры, который будет работать только в пределах нашей активности. Не стоит думать, что это половинчатое решение. Для нашей шестнадцатиричной клавиатуры данный подход является оптимальным. Во-первых, не всем нужна такая клавиатура и устанавливать лишний APK-файл пользователь не захочет. Во-вторых, текстовые поля не имеют атрибута для распознавания шестнадцатиричных чисел и мы не сможем автоматически выводить клавиатуру. Поэтому, вполне логично внедрить нужную клавиатуру там, где она нужна.
Вы вошли на сайт, как гость.
Необходимо зарегистрироваться, чтобы прочитать статью
Источник
Создание своей клавиатуры для android
Сегодня мы научимся делать не что то там, а самую настоящую клавиатуру со всем стандартным набором возможностей, которую при желании вы сможете даже использовать на своем Android устройстве вместо стандартной (ну представьте себе — печатать смс-ки на собственной клавиатуре, что может быть лучше:)). Если вы думаете, что урок будет очень сложным — то вы правы вы ошибаетесь. Оказывается, что в стандартном функционале Android SDK Manager есть абсолютно все необходимое для создания полноценной клавиатуры без лишних страданий. Нам не нужно будет ни вырисовывать внешний вид клавиш, ни настраивать распознавание нажатий клавиш, ни мучиться с привязыванием нашей будущей клавиатуры к полям ввода. Все это уже по умолчанию есть в SDK Manager, нам только осталось научиться этим воспользоваться!
Начнем. Создаем новый проект, я назвал его Keyboard (как мы неоднократно договаривались — все названия на ваше усмотрение, только лишь бы вы сами в них не путались). На том шаге, когда нам предлагается создать какую либо Activity, выбираем Add No Activity и жмем финиш.
Перво наперво, что нам нужно сделать это получить для нашего приложения разрешение ему быть клавиатурой:). Мы хотим создать свое устройство ввода, что называется Input Method Editor (IME), оно определяется в файле манифеста как Service, использующий разрешение BIND_INPUT_METHOD и соответствует действию android.view.InputMethod. Идем в файл манифеста AndroidManifest.xml и добавляем в тег следующее:
Видим красные подчеркивания (нам не привыкать), не волнуемся.
Тег Service содержит тег , который ссылается на несуществующий пока файл method.xml. без этого файла ОС Android не признает нашу клавиатуру как корректный метол ввода, который можно использовать. Этот файл должен содержать подробности о методе ввода и его подтипах. Для нашей клавиатуры определим всего один подтип для en_US локализации (не будем пока экспериментировать с русским, нам главное понять принцип). Создаем в приложении res/layout папку и создаем в ней нужный нам файл method.xml. Вносим в файл res/layout/mehod.xml следующее:
Теперь давайте отредактируем файл строковых ресурсов res/values/strings.xml. Нам нужно добавить сюда строки для:
— название для IME;
— название для подтипа IME;
Имя приложения у нас уже есть, остается только добавить две нужные строчки. Отредактированный файл strings.xml выглядит так:
Теперь нужно определить внешний вид клавиатуры. Файл layout для нашей клавиатуры будет содержать только один объект — KeyboardView. Для того, чтобы наша клавиатура появлялась в низу экрана, настроим атрибут layout_alignParentBottom со значением true. Создаем файл res/layout/keyboard.xml следующее:
Строка keyPreviewLayout отвечает за то, как будет выглядеть нажатая клавиша на нашей клавиатуре. Как видите, за ее вид будет отвечать файл preview, который мы и создадим. Создаем файл res/layout/preview.xml и добавим в него следующее содержимое:
Теперь нужно определить клавиши клавиатуры. Подробное описание клавиш и их расположение описывается в специальном .xml файле. Каждая клавиша имеет следующие атрибуты:
— keyLabel — название клавиши, которое будет отображаться на клавише;
— codes — этот атрибут содержит уникальный код, который характеризует нажатую клавишу.
Каждая клавиша, будь то цифра, буква, какой — либо знач имеют свой собственный уникальный код. Например, буква А имеет значение codes — 97, соответственно keyLabel нужно придать значение «А». Одной клавише можно задать несколько значений в атрибут codes, то клавиша будет принимать определенное значение из этих троих а зависимости от того, сколько раз мы нажали на клавишу (вспомните клавиатурный набор на старых мобильных — на одной клавише «а,б,в,г» и т.д.). Например, если мы зададим кнопке коды 63,33 и 58 то при одном нажатии получим символ «?», при двух нажатиях в короткой последовательности получим «!», а при троих нажатиях — двоеточие «:».
Клавиша может иметь еще несколько атрибутов:
— keyEdgeFlags — атрибут может применять значение left или right. Эти атрибуты добавляются клавишам, которые расположены в самом левом или самом правом положении, соответственно;
— keyWidth — определяет ширину клавиши. Как правило задается в процентах;
— isRepeatable — если этот атрибут имеет значение true, то долгое нажатие на клавишу будет повторять ее действие несколько раз (например «аааааа»), как правило эту опцию включают для клавиш удаления, пробела и т.п.
Клавиши в клавиатуре сгруппированы в колонки. Довольно практично делать по 10 клавиш в колонке и каждой клавише отдавать 10% ширины от общей ширины клавиатуры. Мы выставим высоту клавиш равную 60dp. Можно ее изменять, но не рекомендуется делать высоту меньше 48 dp. У нас будет 5 столбцов клавиш.
Переходим от теории к действию. Создаем файл res/layout/qwerty.xml. Файл должен содержать следующий код:
Некоторые клавиши могут иметь отрицательное значение атрибута codes, они эквиваленты встроенным константам в класс Keyboard. Например, значение -5 соответствует значению Keyboard.KEYCODE_DELETE.
Теперь создадим новый Java класс и назовем его IME.java. Он должен наследовать класс InputMethodService и выполнять интерфейс OnKeyboardActionListener. Этот интерфейс содержит методы, которые вызываются при нажатии на клавиши.
Класс IME должен иметь 3 типа переменных:
— KeyboardView — ссылающийся на вид, определенный в layout файле;
— Keyboard — применяет то, что было назначено в KeyboardView;
— boolean — сообщает о включенном caps lock-е.
Если проделать все сказанное, наш файл IME.java приобретает вид:
Когда клавиатура создана, вызывается метод onCreateInputView. Все переменные тега Service можно инициализировать прямо здесь в методе. Добавьте метод onCreateInputView:
Теперь нужно настроить проигрывание звука при нажатии на клавиши. Используем для этого класс AudioManager. Используем стандартные звуки в методе PlayClick. Код блока настройки звука:
Теперь нам нужно настроить метод onKey для того, чтобы заставить нашу клавиатуру работать с полями ввода (как правило EditText) других приложений. Для этого используется метод getCurrenrInputConection. Здесь нужно настроить следующее:
— commitText — для добавления одного или больше символов в поле ввода;
— deleteSurroundingText — для удаления одного или более символов в поле ввода;
— sendKeyEvent — отослать событие, типа KEYCODE_ENTER, во внешнее приложение (любое где мы будем использовать нашу клавиатуру).
Каждый раз когда пользователь нажимает на клавишу на клавиатуре вызывается метод onKey, передавая уникальное значение (codes рассмотрено выше) нажатой клавиши. Учитывая значение принятого кода, клавиатура выполняет определенное действие, которое соответствует коду.
Приведите свой метод onKey к такому виду:
И вот наконец то все! Мы добили наш урок и клавиатура готова к тестированию. Стоит отметить, что так, как наша клавиатура не имеет никакого Activity (Add No Activity, помните?) то ее после установки на эмулятор или устройство не отобразит среди установленных программ. Все дружно идем в настройки — настройки ввода и клавиатуры и там активируем наше творение, как используемый (или один из используемых) метод ввода. Запускаем что либо, где нужно вводить текст, и тестим!
Источник
Создание пользовательской клавиатуры на Android
Большинство устройств Android не имеют клавиатуры. Вместо этого они полагаются на виртуальную или экранную клавиатуру для ввода текста. Если вы используете персонализацию Android, то знание о создании пользовательской, приятной клавиатуры может вывести ваше хобби на совершенно новый уровень.
Используя Android SDK, вы можете быстро создать экранную клавиатуру с удивительно небольшим количеством строк кода, поскольку SDK выполняет множество задач простого уровня, таких как распознавание касаний клавиш, рисование клавиатуры и установление соединений между клавиатурой и поля ввода.
В этом уроке вы узнаете, как создать полноценную функциональную клавиатуру, которая может служить для вас на вашем устройстве Android по умолчанию.
1. Предпосылки
Вам понадобится комплект Eclipse ADT Bundle. Вы можете загрузить его с веб-сайта разработчика Android.
2. Создать новый проект
Запустите программу Eclipse и создайте новое приложение для Android. Назовите это приложение SimpleKeyboard. Убедитесь, что вы выбрали уникальное имя пакета. Установите минимально необходимый SDK на значение Android 2.2 и установите целевой SDK на значение Android 4.4
Это приложение не будет иметь никаких действий, поэтому снимите флажок с Создать мероприятие и нажмите Готово.
3. Отредактируйте манифест
Экранная клавиатура рассматривается как Input Method Editor (IME) для операционной системы Android. IME объявляется как Service в AndroidManifest.xml, который использует разрешение BIND_INPUT_METHOD и отвечает за android.view.InputMethod .
Добавьте следующие строки в тег application файла манифеста:
4. Создайте метод.
Тег service в файле манифеста содержит meta-data , который ссылается на файл XML с именем method.xml. Без этого файла операционная система Android не признает наш Service в качестве действительной IME-службы. Файл содержит сведения о методе ввода и его подтипах. Для перевода нашей клавиатуры на другой язык мы выбираем один подтип en_US. Создайте каталог res/xml, если его нет, и добавьте к нему файл method.xml. Содержимое файла должно быть следующим:
5. Редактирование строк.xml
Строки, используемые этим приложением, определены в файле theres/values/strings.xml. Нам понадобятся следующие три строки:
- имя приложения
- ярлык IME
- ярлык подтипа IME
Обновите файл strings.xml, чтобы он имел следующее содержимое:
6. Определите макет клавиатуры
Макет нашей клавиатуры содержит только KeyboardView . Атрибут layout_alignParentBottom имеет значение true , чтобы клавиатура отображалась в нижней части экрана.
Создайте файл с именем res/layout/keyboard.xml и замените его содержимое следующим текстом:
KeyPreviewLayout — это макет недолговечного всплывающего окна, которое появляется при каждом нажатии клавиши на клавиатуре. Он содержит единственный TextView . Создайте файл res/layout/preview.xml и добавьте к нему следующее:
6. Определите клавиши клавиатуры
Детали клавиш клавиатуры и их позиции указаны в файле XML. Каждый ключ имеет следующие атрибуты:
- keyLabel : этот атрибут содержит текст, отображаемый на клавише.
- codes : Этот атрибут содержит значения unicode символов, которые представляет ключ.
Например, чтобы определить ключ для буквы A, атрибут codes должен иметь значение 97, а атрибут keyLabel должен быть установлен в A.
Если с ключом связано несколько кодов, тогда символ, который представляет собой ключ, будет зависеть от количества нажатий, которые получает ключ. Например, если ключ имеет коды 63, 33 и 58:
- одно нажатие на клавишу приводит к символу «?»
- два быстрых нажатия приводят к символу «!»
- три отображают символ «:»
Ключ может также иметь несколько необязательных атрибутов:
- keyEdgeFlags : этот атрибут может принимать значение left или right . Этот атрибут обычно добавляется к крайним левым и правым клавишам в строке.
- keyWidth : этот атрибут определяет ширину клавиши. Обычно это определяется в виде процентного значения.
- isRepeatable : если для этого атрибута установлено значение true , длительное нажатие клавиши будет повторять действие клавиши несколько раз. Обычно значение true установлено для клавиш удаления и пробела.
Клавиши клавиатуры сгруппированы в виде строк. Рекомендуется ограничить количество клавиш в строке до десяти, причем каждая клавиша имеет ширину, равную 10% от клавиатуры. В этом уроке высота клавиш установлена в 60dp. Это значение можно отрегулировать, но значения менее 48dp не рекомендуются. У нашей клавиатуры будет пять рядов ключей.
Теперь мы можем идти вперед и разрабатывать клавиатуру. Создайте новый файл с именем res/xml/qwerty.xml и замените его содержимое следующим текстом:
Возможно, вы заметили, что некоторые ключи имеют отрицательные значения в атрибуте codes . Отрицательные значения равны предопределенным константам для класса Keyboard . Например, значение -5 равно значению Keyboard.KEYCODE_DELETE .
7. Создание класса Service
Создайте новый класс Java и назовите его SimpleIME.java. InputMethodService и реализовать интерфейс OnKeyboardActionListener . Интерфейс OnKeyboardActionListener содержит методы, вызываемые при касании или нажатии клавиш экранной клавиатуры.
Класс SimpleIME должен иметь три переменные-члена:
- KeyboardView , ссылающийся на представление, определенное в макете
- Экземпляр Keyboard , который назначен для KeyboardView
- boolean , сообщает нам включен ли caps lock
После объявления этих переменных и добавления методов интерфейса OnKeyboardActionListener класс SimpleIME должен выглядеть следующим образом:
Когда клавиатура создана, вызывается метод onCreateInputViewmethod . Здесь могут быть инициализированы все переменные Service . Обновите реализацию метода onCreateInputView , как показано ниже:
Затем мы создаем метод, который воспроизводит звук при нажатии клавиши. Мы используем класс AudioManager для воспроизведения звука. Android SDK включает в себя несколько стандартных звуковых эффектов по умолчанию для нажатия клавиш, и они используются в методе playClick .
Наконец, обновите метод onKey , чтобы наше приложение могло взаимодействовать с полями ввода (как правило, EditText ) других приложений.
Метод getCurrentInputConnection используется для получения соединения с полем ввода другого приложения. После подключения мы можем использовать следующие методы:
- commitText для добавления одного или нескольких символов в поле ввода
- deleteSurroundingText для удаления одного или нескольких символов поля ввода
- sendKeyEvent для отправки событий, таких как KEYCODE_ENTER , во внешнее приложение
Всякий раз, когда пользователь нажимает клавишу на клавиатуре, onKey вызывается с использованием значения unicode ключа в качестве одного из его параметров. Основываясь на этом значении, клавиатура выполняет одно из следующих действий:
- В случае, если код следующий — KEYCODE_DELETE , то один символ слева от курсора удаляется с помощью метода deleteSurroundingText .
- В случае, Если код — KEYCODE_DONE , событие ключа KEYCODE_ENTER запускается.
- В случае, Если код — KEYCODE_SHIFT , значение caps изменяется, а состояние нажатия клавиатуры обновляется с помощью метода setShifted . При изменении состояния нажатия клавиши должны быть перерисованы, чтобы надписи клавиш были обновлены. InvalidateAllKeys используется для перерисовки всех ключей.
- Для всех других кодов код просто преобразуется в символ и отправляется в поле ввода. Если код представляет букву алфавита, а переменная caps имеет значение true , то символ преобразуется в верхний регистр.
Обновите метод onKey , чтобы он выглядел так:
8. Тестирование клавиатуры
Итак, экранная клавиатура готова к тестированию. Скомпилируйте и запустите её на устройстве Android. Это приложение не имеет Activity , что означает, что оно не появится в панели запуска. Чтобы использовать её, его следует сначала активировать в настройках устройства.
После активации Simple IME откройте любое приложение, которое позволяет вводить текст (например, любое приложение для обмена сообщениями) и понажимайте по одному из его полей ввода. Вы должны увидеть значок клавиатуры в области уведомлений. В зависимости от вашего устройства вы можете щелкнуть по этому значку или перетащить панель уведомлений вниз и выбрать Simple IME в качестве метода ввода. Теперь вы можете использовать новую клавиатуру.
Источник