Как сделать свою клавиатуру для андроид
Перейти к содержимому

Как сделать свою клавиатуру для андроид

  • автор:

Кастомизируем раскладку внешней клавиатуры на Android без root

Мне нравится раскладка клавиатур на Mac: Cmd(Ctrl) под большим пальцем и возможность, без шаманства, прямо в настройках изменить поведение CapsLock. Такого же результата легко добиться в Linux с помощью setxkbmap в консоли или, например, gnome-tweak-tool в UI. Но что делать, если клавиатура подключается к Android?

В Android существует несколько способов кастомизировать внешнюю клавиатуру:

  1. Установка сторонней клавиатуры. Например, External Keyboard Helper.
  2. Правка/добавление kl или kcm файлов (требуется root). Как, например, в этом посте.
  3. Установка приложения, которое добавляет дополнительные клавиатурные раскладки.

Устанавливать стороннюю клавиатуру не хочется. Рутовать телефон — тоже. Остаётся третий вариант.

Теория

Вкратце пробежимся по основным понятиям со ссылками на документацию.

Key Layout файлы

Key layout (.kl) файлы отображают линуксовые коды клавиш (Linux Key Code), т.е. код, который производит конкретная клавиша на клавиатуре, на андродовские клавиши (Android Key), т.е. TAB, ENTER или просто буква F. Отображение по-умолчанию можно посмотреть здесь. Узнать, какая клавиша на клавиатуре какой код производит, можно, например, с помощью Gamepad Tester.

Key Character Map файлы

Key Character Map (.kcm) файлы позволяют задать поведение для сочетания клавиш, а также нужны для добавления раскладок, отличных от English(US).

Дополнительные клавиатурные раскладки

Начиная с версии 4.1 в Android стало возможным устанавливать вместе с приложением дополнительные раскладки клавиатуры. После установки раскладки доступны в Settings -> Language & input -> Physical keyboard . Минус этого подхода в том, что раскладки неизменяемы, и нет возможности кастомизировать их «на лету».

Практика

Вот что я хочу получить для моей клавиатуры:

  • Esc вместо CapsLock.
  • Поменять Ctrl/Win/Alt на Win/Alt/Ctrl слева и Alt/PrintScreen/Ctrl на Ctrl/Alt/Ctrl справа.
  • Поменять переключение приложений с Alt+Tab на Ctrl+Tab.
  • Скриншот на Ctrl+Shift+3.
  • Переключение языков по Win+Space.
  • Поддержка английской и русской раскладок.

Описание проекта

Т.к. мои вкусы весьма специфичны (Ты же хочешь Ctrl вместо CapsLock, мой дорогой любитель Vim?), а раскладки неизменяемы «на лету», я не предоставляю готовый apk-файл. Вместо этого создан custom-keyboard-layout — проект основа для кастомизации раскладки внешней клавиатуры на Android.

Клонируем проект к себе

git clone git@github.com:ris58h/custom-keyboard-layout.git

Манифест приложения app/src/main/AndroidManifest.xml :

Приложение состоит из одного reciever . Забавно, что само наличие класса с заданным именем (в нашем случае InputDeviceReceiver ) не требуется — всё работает и без него, но имя мы задать обязаны. Этот reciever предоставляет список клавиатурных раскладок, хранящийся в app/src/main/res/xml/keyboard_layouts.xml :

В списке только одна раскладка — keyboard_layout_en_us .

Кастомизация файла раскладки

Файл раскладки app/src/main/res/raw/keyboard_layout_en_us.kcm состоит из одной строки, задающей тип раскладки:

type OVERLAY

Про этот тип ничего не сказано в документации, но опытным путём выяснено, что раскладка с таким типом по-умолчанию берёт значения из Generic.kcm. Т.е. мы уже получили английскую раскладку и всё что остаётся — это добавить наши правила.

Но сперва небольшое отступление про Key Layout файлы. Раскладки задаётся как kcm-файл, но для того чтобы поменять местами, например, Ctrl и Alt необходим kl-файл. Тут на помощь приходит ещё одна незадокументированная фича: с помощью команды map можно добавлять правила из kl-файла в kcm-файл.

Файл keyboard_layout_en_us.kcm с моими правилами:

type OVERLAY map key 58 ESCAPE map key 29 META_LEFT map key 56 CTRL_LEFT map key 125 ALT_LEFT map key 99 ALT_RIGHT map key 100 CTRL_RIGHT key TAB < label: '\t' base: '\t' ctrl: fallback APP_SWITCH >key 3

К сожалению, у меня не получилось задать переключение языков по Win+Space — такое правило просто не срабатывало.

Добавляем раскладку с другим языком

Для добавления раскладки другого языка, отличного от English(US), нужно сперва составить kcm-файл с раскладкой этого языка, затем добавить к нему наши правила. Взять готовый файл для своего языка можно отсюда. Берём keyboard_layout_russian.kcm, кладём в app/src/main/res/raw/ и, соответственно, добавляем ещё одну раскладку в app/src/main/res/xml/keyboard_layouts.xml :

Не забываем добавить keyboard_layout_ru_label в app/src/main/res/values/strings.xml .
Теперь можно добавить наши правила, как в примере с английской раскладкой, но с небольшим изменением. В русской раскладке уже есть правило для ‘3’, поэтому нужно лишь изменить его, а не добавлять новое:

key 3

Состояние проекта после этой кастомизации можно посмотреть в ветке Vendor_17ef_Product_6048.

Установка

Собираем и устанавливаем наше приложение. Проще всего это сделать с помощью Android Studio следуя официальной документации.

Если всё сделано правильно, то в Settings -> Language & input -> Physical keyboard появятся наши раскладки, а в списке приложений — Custom Keyboard Layout .

Заключение

Кастомизация внешней клавиатуры без root возможна. Не все хотелки при этом достижимы: переключение языков по Win+Space так и не заработало, но это может быть проблемой прошивки.

Статья нарочно сделана краткой — все подробности можно найти по ссылкам.

Как дополнить экранную клавиатуру Android дополнительными символами или создать свою раскладку клавиатуры?

Пользуюсь HTC Desire. Остро недостаёт русских кавычек («ёлочек»), длинного тире (—) и неразрывного пробела; не отказался бы и от других символов раскладки Бирмана.

Поэтому вопрос: можно ли пополнить экранную клавиатуру HTC Desire дополнительными символами? Если да, то как? Если нет, то какие существуют обходные способы (создать свою раскладку клавиатуры? скачать другую клавиатуру, для которой существуют средства смены раскладок?)?…

  • Вопрос задан более трёх лет назад
  • 31245 просмотров

Как написать свою клавиатуру для Android

Здравствуйте. В данной статье я постараюсь рассказать и показать основные моменты написания собственной клавиатуры для Android’а. Статья предназначена для разработчиков, которые с этим не сталкивались, но имеют опыт знакомства с Android’ом.

Сразу оговорюсь, что мнение и код автора не являются истинной в последней инстанции, а ваши предложения и критика лишь приветствуются. И если не охота все читать, ссылка на исходники в конце статьи.

Для начала необходимо создать пустой Android проект без Activity. После этого приступим к подготовке .xml файлов, которые будут описывать Android’у нашу клавиатуру.

Базовый layout-файл, keyboard.xml

Содержит в себе View класс Android’а под названием KeyboardView и описывает внешний вид клавиатуры.

  • android: keyPreviewHeight — задает высоту элемента подсказки, на котором отображается текущая нажатая клавиша.
  • android:keyPreviewLayout — указываем layout-файл, который описывает внешний вид preview’шки.

Важный момент, атрибут background является обязательным, если его не указать, то при каждом нажатии клавиши ваша клавиатура будет падать.

Описание раскладки

Итак, мы подготовили 2 .xml файла, которые описывают внешний вид, теперь настал черед описать саму раскладку клавиатуры. Назовем этот файл keys_definition_ru.xml и находится он будет в xml ресурсах проекта. Здесь будет представлен лишь его кусок, так как файл достаточно большой.

Все атрибуты описывать не будем, лишь «не очевидные».

  • android:horizontalGap — горизонтальный отступ между клавишами
  • android: verticalGap — вертикальный отступ
  • android:codes — код нужного символа в html utf-8 (и не только utf-8, подробнее в оф. документации)
  • android:keyEdgeFlags — атрибут может применять значение left или right. Эти атрибуты добавляются клавишам, которые расположены в самом левом крае или самом правом крае клавиатуры
  • android:isRepeatable — повторять действие клавиши при долгом нажатии (обычно используется на пробеле или backspace)

InputMethodService — сервис клавиатуры

Теперь, после того как мы создали все необходимые xml файлы, приступаем к описанию сервиса, который будет слушать события InputMethod.

Для этого создадим сервис, наследуясь от InputMethodService и сразу реализуем интерфейс KeyboardView.OnKeyboardActionListener. В итоге у вас получиться набор методов, которые вы можете переопределить и наполнить необходимой функциональностью, которые позволяют широко кастомизировать вашу клавиатуру. Но здесь я приведу лишь примеры базовых моментов.

Методы onCreateInputView и onKey

 @Override public View onCreateInputView() < mKeyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard, null); mKeyboard = new Keyboard(this, R.xml.keys_definition_ru); mKeyboard.setShifted(isCapsOn); //приводим клавиатуру к верхнему регистру, если шифт нажат включен mKeyboardView.setKeyboard(mKeyboard); mKeyboardView.setOnKeyboardActionListener(this); return mKeyboardView; >@Override public void onKey(int primaryCode, int[] ints) < Log.d(TAG, "onKey " + primaryCode); InputConnection ic = getCurrentInputConnection(); playClick(primaryCode); switch (primaryCode) < case Keyboard.KEYCODE_DELETE: ic.deleteSurroundingText(1, 0); break; case Keyboard.KEYCODE_SHIFT: handleShift(); break; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); break; case Keyboard.KEYCODE_ALT: handleSymbolsSwitch(); break; case Keyboard.KEYCODE_MODE_CHANGE: handleLanguageSwitch(); break; default: char code = (char) primaryCode; if (Character.isLetter(code) && isCapsOn) < code = Character.toUpperCase(code); >ic.commitText(String.valueOf(code), 1); break; > > 

Одним из методов жизненного цикла InputMethodService является onCreateInputView внутри которого мы создаем View клавиатуры и привязываем к ней необходимые листенеры.

Событие onKey срабатывает между onPress и onRelease, на вход им подается код нажатой клавиши.

Итак, все готово… почти, осталось добавить наш сервис в манифест.

Поздравляю, вы написали свою первую клавиатуру!

Как создать свою клавиатуру

введите сюда описание изображения

Можно ли сделать так, чтобы при вводе в EditText клавиатура показывала не весь набор символов алфавита, а только те символы, которые есть в переменной String. Здесь как то сделано

Отслеживать

Hellraiser

задан 14 окт 2016 в 16:34

Hellraiser Hellraiser

981 2 2 золотых знака 7 7 серебряных знаков 23 23 бронзовых знака

А ты можешь кстати заморочиться и сделать немного не EditText , а свой View , при нажатии на который будешь открывать снизу свою Layout клавиатуры поверх Layout активности, в которой сделаешь кнопочки своего стиля, при нажатии на которые на твоём View будет добавляться буква кнопочки ( mView.setText(mView.getText().toString() + «A»); при нажатии на букву А, и т.д.). Если хочешь я могу заморочиться тебе это сделать за пару дней, реально не плохой вариант. Тогда объяви свой вопрос конкурсным.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *