Введение:
Метод ввода (IME) — это пользовательский элемент управления, который позволяет пользователю вводить текст. Android
предоставляет расширяемую структуру методов ввода. С помощью этой платформы приложения могут предоставлять пользователям альтернативные методы ввода, такие как экранная клавиатура или даже голосовой ввод. После установки нужного IME
пользователь может выбрать IME для использования в системных настройках и использовать этот IME во всей системе; одновременно может быть включен только один IME.
Как разработать простой метод ввода, вы должны сначала понять структуру метода ввода IMF, которая поставляется с Android.
1. Жизненный цикл ИВМ:
Суть метода ввода — это служба.Предполагая, что пользователь только что запустил приложение, когда фокус впервые попадает в поле редактирования текста, Android уведомит службу о начале инициализации, как показано на диаграмме жизненного цикла:
-
Сначала выполните метод onCreate , который инициализирует разделитель строковых переменных.
-
Во-вторых, выполните метод onCreateInputView . При отображении области, введенной пользователем, платформа Android вызовет этот метод. Этот метод инициализирует inputview, считывает информацию о файле макета, устанавливает onKeyboardActionListener и первоначально устанавливает клавиатуру.
-
Затем выполните метод onCreateCandidatesView , который вызывается платформой, когда необходимо отобразить представление некоторых слов-кандидатов, подобно описанному выше методу onCreateInputView, где инициализируется представление-кандидат.
-
Наконец, выполните метод onStartInputView , чтобы повторно связать представление ввода с текущей клавиатурой.
2. Схема архитектуры метода ввода Android:
Поясняется значение некоторых терминов на рисунке:
- IMMS: служба управления методами ввода InputMethodManagerService
- IMM: управление методом ввода InputMethodManager
- IMS: служба метода ввода InputMethodService
3. Некоторые компоненты фреймворка используют
В системе Android IME — это приложение Android, включающее специальную службу IME. Файл манифеста приложения должен объявить службу, запросить необходимые разрешения, предоставить фильтр Intent,
соответствующий действию action.view.InputMethod , и предоставить метаданные, определяющие характеристики IME.
Разрешение BIND_MIDI_DEVICE_SERVICE
Следующий фрагмент кода объявляет службу IME:
<!-- Declares the input method service -->
<service android:name="FastInputIME"
android:label="@string/fast_input_label"
android:permission="android.permission.BIND_INPUT_METHOD">
***//请求BIND_MIDI_DEVICE_SERVICE让此服务可以将IME连接到系统***
<intent-filter>
//设置一个与InputMethod操作匹配的intent过滤器
<action android:name="android.view.InputMethod" />
</intent-filter>
***//定义此IME的元数据***
<meta-data android:name="android.view.im"
android:resource="@xml/method" />
</service>
Действие, управляющее настройками IME
<!-- Optional: an activity for controlling the IME settings -->
<activity android:name="FastInputIMESettings"
android:label="@string/fast_input_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
API метода ввода
Специфичные для IME классы предоставляются в пакетах android.inputmethodservice и android.view.inputmethod . Класс KeyEvent очень важен для обработки символов клавиатуры.
КлавиатураВид
Расширение View для визуализации клавиатуры и реагирования на события пользовательского ввода. Раскладка клавиатуры определяется экземпляром Keyboard, который может быть определен в XML-файле.
Базеинпутконнектион
Определяет канал связи от InputMethod
обратно к приложению, получившему ввод. Вы можете использовать этот класс для чтения текста вокруг курсора, отправки текста в текстовое поле, а затем отправки необработанных событий нажатия клавиш в ваше приложение. Приложения должны расширять этот класс вместо реализации базового интерфейса
InputConnection.
Дизайн интерфейса метода ввода:
вид ввода
Представление ввода — это интерфейс, в котором пользователь вводит текст в виде нажатий клавиш, рукописного ввода или жестов. При первом отображении IME система вызывает
обратный вызов onCreateInputView().
- onCreateInputView создает представление области клавиатуры и возвращает макет макета.
Попытка кандидата
Представление «Кандидат» — это интерфейс, в котором IME отображает возможные исправления слов или текстовые предложения, которые пользователь может выбрать. Во время жизненного цикла IME система вызывает
onCreateCandidatesView(), когда представления-кандидаты готовы к отображению.
- onCreateCandidatesView создает представление области кадра-кандидата и возвращает макет макета. Это представление не является обязательным. Если вы не хотите отображать какой-либо контент, вы можете вернуть Null. На самом деле, ответ Null — это поведение по умолчанию, и этот метод не может быть реализован.
4. Напишите простой метод ввода
В AndroidManifest.xml:
<!-- 输入法服务 -->
<service
android:name="com.....自定义InputMethodService"
android:label="@string/app_name"
android:permission="android.permission.BIND_INPUT_METHOD" >//请求权限绑定输入法,请求 InputMethodService 服务,只有系统才能使用。
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
<meta-data
android:name="android.view.im"
android:resource="@xml/method" />
</service>
<!-- 输入法设置界面 -->
<activity android:name="com.....setting.自定义SettingsActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
метод.xml
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:isDefault="true"
android:settingsActivity="com.....setting.自定义SettingsActivity" />
//输入法设置界面
Вот метод для некоторых функций
1. Переместите курсор влево и вправо
/**
* 输入框的光标向右移动
*/
public void setCursorRightMove() {
int cursorPos = getSelectionStart();
cursorPos++;
getCurrentInputConnection().setSelection(cursorPos, cursorPos);
}
/**
* 输入框的光标向左移动
*/
public void setCursorLeftMove() {
int cursorPos = getSelectionStart();
cursorPos--;
if (cursorPos < 0)
cursorPos = 0;
getCurrentInputConnection().setSelection(cursorPos, cursorPos);
}
2. Ввод текста в EditText
/**
* 文字输入到EditText
*/
public void commitResultText(String resultText) {
InputConnection ic = getCurrentInputConnection();
if (null != ic && !TextUtils.isEmpty(resultText)) {
ic.commitText(resultText, 1);
}
}
3. Отображение метода ввода не занимает весь экран
/**
* 输入法显示不占据全屏
*/
@Override
public boolean onEvaluateFullscreenMode() {
return false;
}
Хун Жунцзянь
Оригинальный адрес: https://blog.csdn.net/m0_56202936/article/details/128056382