Говоря об архитектуре метода ввода Android (IME)

Введение:

Метод ввода (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

Supongo que te gusta

Origin blog.csdn.net/fjnu_se/article/details/128179769
Recomendado
Clasificación