Android codes key keyboard inputmethodservice

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

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

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

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

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

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

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

Код 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. В итоге у вас получиться набор методов, которые вы можете переопределить и наполнить необходимой функциональностью, которые позволяют широко кастомизировать вашу клавиатуру. Но здесь я приведу лишь примеры базовых моментов.

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

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

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

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

Источник

Create a Custom Keyboard on Android

Most Android devices don’t have a physical keyboard. Instead, they rely on a virtual or soft keyboard to accept user input. If you’re into Android personalization, knowing how to build a custom, soft keyboard can take your hobby to a whole new level.

Using the Android SDK, you can quickly create a soft keyboard with surprisingly few lines of code, because the SDK takes care of a lot of the low level tasks, such as recognizing key touches, drawing the keyboard, and establishing connections between the keyboard and input fields.

In this tutorial, you will learn how to create a fully functional soft keyboard that can serve as your Android device’s default keyboard.

Premium Option

If you’re in a hurry, check out Android Keyboard Themes, a ready-to-use solution from Envato Market.

The app gives you the flexibility to choose one of the 22 built-in keyboard themes or create your own custom theme.

Or you could hire a freelancer on Envato Studio. Just browse through our Mobile & Apps section and you’re sure to find an expert who can help you.

Mobile & app developers on Envato Studio

If you prefer to build your own, read on to find out how.

1. Prerequisites

You will need the Eclipse ADT Bundle installed. You can download it from the Android Developer website.

2. Create a New Project

Fire up Eclipse and create a new Android application. Call this application, SimpleKeyboard. Make sure you choose a unique package name. Set the minimum required SDK to Android 2.2 and set the target SDK to Android 4.4.

This app will have no activities so deselect Create Activity and click Finish.

3. Edit the Manifest

A soft keyboard is considered as an Input Method Editor (IME) by the Android operating system. An IME is declared as a Service in AndroidManifest.xml that uses the BIND_INPUT_METHOD permission, and responds to the action android.view.InputMethod .

Add the following lines to the application tag of the manifest:

4. Create method.xml

The service tag in the manifest file containes a meta-data tag that references an XML file named method.xml. Without this file, the Android operating system won’t recognize our Service as a valid IME service. The file contains details about the input method and its subtypes. For our keyboard, we define a single subtype for the en_US locale. Create the directory res/xml if it doesn’t exist, and add the file method.xml to it. The contents of the file should be:

Читайте также:  Самый лучший плеер для андроид 2021 года

5. Edit strings.xml

The strings that this app uses are defined in the res/values/strings.xml file. We’re going to need three strings:

  • the name of the app
  • the label of the IME
  • the label of the IME’s subtype

Update your strings.xml so that it has the following contents:

6. Define the Keyboard Layout

The layout of our keyboard contains only a KeyboardView . The layout_alignParentBottom attribute is set to true so that keyboard appears at the bottom of the screen.

Create a file named res/layout/keyboard.xml and replace its contents with the following:

The keyPreviewLayout is the layout of the short-lived pop-up that shows up whenever a key on the keyboard is pressed. It contains a single TextView . Create a file named res/layout/preview.xml and add the following to it:

6. Define the Keyboard Keys

The details of the keyboard keys and their positions are specified in an XML file. Every key has the following attributes:

  • keyLabel : This attribute contains the text that is displayed on the key.
  • codes : This attribute contains the unicode values of the characters that the key represents.

For example, to define a key for the letter A, the codes attribute should have the value 97 and the keyLabel attribute should be set to A.

If more than one code is associated with a key, then the character that the key represents will depend on the number of taps the key receives. For example, if a key has the codes 63, 33, and 58:

  • a single tap on the key results in the character ?
  • two taps in quick succession results in the character !
  • three taps in quick succession results in the character :

A key can also have a few optional attributes:

  • keyEdgeFlags : This attribute can take the value left or right . This attribute is usually added to the leftmost and rightmost keys of a row.
  • keyWidth : This attribute defines the width of a key. It’s usually defined as a percentage value.
  • isRepeatable : If this attribute is set to true , long-pressing the key will repeat the action of the key multiple times. It is usually set to true for the delete and spacebar keys.

The keys of a keyboard are grouped as rows. It’s good practice to limit the number of keys on a row to a maximum of ten, with each key having a width equal to 10% of the keyboard. The height of the keys is set to 60dp in this tutorial. This value can be adjusted, but values less than 48dp are not recommended. Our keyboard will have five rows of keys.

We can now go ahead and design the keyboard. Create a new file named res/xml/qwerty.xml and replace its contents with the following:

You may have noticed that some keys have negative values for the codes attribute. Negative values are equal to predefined constants in the Keyboard class. For example, the value -5 is equal to the value of Keyboard.KEYCODE_DELETE .

7. Create a Service Class

Create a new Java class and call it SimpleIME.java. The class should extend InputMethodService class and implement the OnKeyboardActionListener interface. The OnKeyboardActionListener interface contains the methods that are called when keys of the soft keyboard are tapped or pressed.

The SimpleIME class should have three member variables:

  • a KeyboardView referencing the view defined in the layout
  • a Keyboard instance that is assigned to the KeyboardView
  • a boolean telling us if the caps lock is enabled

After declaring these variables and adding the methods of the OnKeyboardActionListener interface, the SimpleIME class should look like this:

When the keyboard is created, the onCreateInputView method is called. All the member variables of the Service can be initialized here. Update the implementation of the onCreateInputView method as shown below:

Next, we create a method that plays a sound when a key is pressed. We use the AudioManager class to play the sounds. The Android SDK includes a few default sound effects for key presses and those are used in the playClick method.

Finally, update the onKey method so that our keyboard app can communicate with input fields (usually EditText views) of other applications.

The getCurrentInputConnection method is used to get a connection to the input field of another application. Once we have the connection, we can use the following methods:

  • commitText to add one or more characters to the input field
  • deleteSurroundingText to delete one or more characters of the input field
  • sendKeyEvent to send events, like KEYCODE_ENTER , to the external application

Whenever a user presses a key on the soft keyboard, the onKey method is called with the unicode value of the key as one of its parameters. Based on this value, the keyboard performs one of the following actions:

  • If the code is KEYCODE_DELETE , one character to the left of the cursor is deleted using the deleteSurroundingText method.
  • If the code is KEYCODE_DONE , a KEYCODE_ENTER key event is fired.
  • If the code is KEYCODE_SHIFT , the value of the caps variable is changed and the shift state of the keyboard is updated using the setShifted method. The keyboard needs to be redrawn when the state changes so that the labels of the keys are updated. The invalidateAllKeys method is used to redraw all keys.
  • For all other codes, the code is simply converted into a character and sent to the input field. If the code represents a letter of the alphabet and the caps variable is set to true , then the character is converted to uppercase.
Читайте также:  Муз проигрыватель для андроид по папкам

Update the onKey method so that it looks like this:

8. Testing the Keyboard

The soft keyboard is now ready to be tested. Compile and run it on an Android device. This app doesn’t have an Activity , which means that it won’t show up in the launcher. To use it, it should first be activated in the device’s Settings.

After activating Simple IME, open any app that allows text input (for example, any messaging app) and click on one of its input fields. You should see a keyboard icon appear in the notifications area. Depending on your device, you can either click on that icon or drag the notification bar down and select Simple IME as the input method. You should now be able to type using your new keyboard.

Источник

Keyboard.Key

java.lang.Object
android.inputmethodservice.Keyboard.Key

Class Overview

Class for describing the position and characteristics of a single key in the keyboard.

Summary

XML Attributes
android:codes The unicode value or comma-separated values that this key outputs.
android:horizontalGap Default horizontal gap between keys.
android:iconPreview The icon to show in the popup preview.
android:isModifier Whether this is a modifier key such as Alt or Shift.
android:isRepeatable Whether long-pressing on this key will make it repeat.
android:isSticky Whether this is a toggle key.
android:keyEdgeFlags Key edge flags.
android:keyHeight Default height of a key, in pixels or percentage of display width.
android:keyIcon The icon to display on the key instead of the label.
android:keyLabel The label to display on the key.
android:keyOutputText The string of characters to output when this key is pressed.
android:keyWidth Default width of a key, in pixels or percentage of display width.
android:popupCharacters The characters to display in the popup keyboard.
android:popupKeyboard The XML keyboard layout of any popup keyboard.
Fields
codes All the key codes (unicode or custom code) that this key could generate, zero’th being the most important.
edgeFlags Flags that specify the anchoring to edges of the keyboard for detecting touch events that are just out of the boundary of the key.
gap The horizontal gap before this key
height Height of the key, not including the gap
icon Icon to display instead of a label.
iconPreview Preview version of the icon, for the preview popup
label Label to display
modifier Whether this is a modifier key, such as Shift or Alt
on If this is a sticky key, is it on?
popupCharacters Popup characters
popupResId If this key pops up a mini keyboard, this is the resource id for the XML layout for that keyboard.
pressed The current pressed state of this key
repeatable Whether this key repeats itself when held down
sticky Whether this key is sticky, i.e., a toggle key
text Text to output when pressed.
width Width of the key, not including the gap
x X coordinate of the key in the keyboard layout
y Y coordinate of the key in the keyboard layout
Public Constructors

XML Attributes

android:codes

The unicode value or comma-separated values that this key outputs.

May be a string value, using ‘\\;’ to escape characters such as ‘\\n’ or ‘\\uxxxx’ for a unicode character.

May be an integer value, such as » 100 «.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol codes .

Related Methods

android:horizontalGap

Default horizontal gap between keys.

May be a dimension value, which is a floating point number appended with a unit such as » 14.5sp «. Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), in (inches), mm (millimeters).

May be a fractional value, which is a floating point number appended with either % or %p, such as » 14.5% «. The % suffix always means a percentage of the base size; the optional %p suffix provides a size relative to some parent container.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol horizontalGap .

Related Methods

android:iconPreview

The icon to show in the popup preview.

Must be a reference to another resource, in the form » @[+][package:]type:name » or to a theme attribute in the form » ?[package:][type:]name «.

This corresponds to the global attribute resource symbol iconPreview .

Related Methods

android:isModifier

Whether this is a modifier key such as Alt or Shift.

Must be a boolean value, either » true » or » false «.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol isModifier .

Related Methods

android:isRepeatable

Whether long-pressing on this key will make it repeat.

Must be a boolean value, either » true » or » false «.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol isRepeatable .

Related Methods

android:isSticky

Whether this is a toggle key.

Must be a boolean value, either » true » or » false «.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol isSticky .

Related Methods

android:keyEdgeFlags

Must be one or more (separated by ‘|’) of the following constant values.

Constant Value Description
left 1 Key is anchored to the left of the keyboard.
right 2 Key is anchored to the right of the keyboard.

This corresponds to the global attribute resource symbol keyEdgeFlags .

Related Methods

android:keyHeight

Default height of a key, in pixels or percentage of display width.

May be a dimension value, which is a floating point number appended with a unit such as » 14.5sp «. Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), in (inches), mm (millimeters).

May be a fractional value, which is a floating point number appended with either % or %p, such as » 14.5% «. The % suffix always means a percentage of the base size; the optional %p suffix provides a size relative to some parent container.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol keyHeight .

Related Methods

android:keyIcon

The icon to display on the key instead of the label.

Must be a reference to another resource, in the form » @[+][package:]type:name » or to a theme attribute in the form » ?[package:][type:]name «.

This corresponds to the global attribute resource symbol keyIcon .

Related Methods

android:keyLabel

The label to display on the key.

Must be a string value, using ‘\\;’ to escape characters such as ‘\\n’ or ‘\\uxxxx’ for a unicode character.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol keyLabel .

Related Methods

android:keyOutputText

The string of characters to output when this key is pressed.

Must be a string value, using ‘\\;’ to escape characters such as ‘\\n’ or ‘\\uxxxx’ for a unicode character.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol keyOutputText .

Related Methods

android:keyWidth

Default width of a key, in pixels or percentage of display width.

May be a dimension value, which is a floating point number appended with a unit such as » 14.5sp «. Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), in (inches), mm (millimeters).

May be a fractional value, which is a floating point number appended with either % or %p, such as » 14.5% «. The % suffix always means a percentage of the base size; the optional %p suffix provides a size relative to some parent container.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol keyWidth .

Related Methods

android:popupCharacters

The characters to display in the popup keyboard.

Must be a string value, using ‘\\;’ to escape characters such as ‘\\n’ or ‘\\uxxxx’ for a unicode character.

This may also be a reference to a resource (in the form » @[package:]type:name «) or theme attribute (in the form » ?[package:][type:]name «) containing a value of this type.

This corresponds to the global attribute resource symbol popupCharacters .

Related Methods

android:popupKeyboard

The XML keyboard layout of any popup keyboard.

Must be a reference to another resource, in the form » @[+][package:]type:name » or to a theme attribute in the form » ?[package:][type:]name «.

This corresponds to the global attribute resource symbol popupKeyboard .

Источник

Читайте также:  Драйвер андроид для ноутбука
Оцените статью