输入法前置知识:
要将某个IME声明为默认输入法,可以通过以下步骤实现:
在AndroidManifest.xml文件中声明IME服务。在<application>标签内添加以下代码:
<service android:name=".MyInputMethodService" android:label="@string/ime_name" android:permission="android.permission.BIND_INPUT_METHOD"> <meta-data android:name="android.view.im" android:resource="@xml/method" /> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> </service>
其中,android:name指定了IME服务的类名,android:label指定了IME的名称,android:permission指定了IME服务的权限,meta-data指定了IME的属性,intent-filter指定了IME服务的Intent过滤器。
在res/xml目录下创建method.xml文件,指定IME的属性。例如:
<?xml version="1.0" encoding="utf-8"?> <input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity=".MyInputMethodSettingsActivity" android:supportsSwitchingToNextInputMethod="true" />
其中,android:settingsActivity指定了IME的设置界面,android:supportsSwitchingToNextInputMethod指定了是否支持切换到下一个输入法。
在IME服务的onCreate()方法中,调用InputMethodManager的setAdditionalInputMethodSubtypes()方法,设置IME支持的语言环境。例如:
@Override public void onCreate() { super.onCreate(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodSubtype subtype = new InputMethodSubtype .InputMethodSubtypeBuilder() .setSubtypeLocale("en_US") .setSubtypeMode("keyboard") .setSubtypeExtraValue("qwerty") .build(); imm.setAdditionalInputMethodSubtypes(getToken(), new InputMethodSubtype[]{subtype}); }
其中,setSubtypeLocale()指定了语言环境,setSubtypeMode()指定了输入模式,setSubtypeExtraValue()指定了额外的参数。
在IME服务的onStartInput()方法中,调用InputMethodManager的setInputMethod()方法,将IME设置为默认输入法。例如:
@Override public void onStartInput(EditorInfo attribute, boolean restarting) { super.onStartInput(attribute, restarting); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.setInputMethod(getToken(), getComponentName()); }
其中,getToken()返回IME服务的令牌,getComponentName()返回IME服务的组件名称。
以上就是通过代码将某个IME声明为默认输入法的步骤。需要注意的是,这个过程中需要获取一些系统权限,例如BIND_INPUT_METHOD权限和WRITE_SECURE_SETTINGS权限。
1.这个方法是用来重置默认默认输入法的
2.当选中的默认输入法是第三方的输入法,这不进行重置,直接return,即尊重用户选择
3.getDefaultEnabledImes() 获取所有将可以作为默认输入法的候选输入法
4.当重置,候选输入法有多个时,选择集合中的第一个
1.以上方法即重置默认输入法时,获取候选输入法的方法
2.获取fallbackLocale和systemLocale,作为筛选候选输入法的依据
3.getFallbackLocaleForDefaultIme() ,就是获取系统输入法(非第三方输入法)中有子类型支持备选语言环境的输入法(一个输入法可以有多个子类型,每个子类型可以支持不同的Locale,如何设置子类型的locale和mode见前面的前置知识)
1.此方法用于获取备用语言环境Locale
2.第一个for循环,查找是否存在将遍历的数组( SEARCH_ORDER_OF_FALLBACK_LOCALES)中的某一个fallbackLocale声明为“default”的输入法,存在则返回这个备用语言环境Locale
3.第二个for循环,当第一个for循环查找不到将数组(SEARCH_ORDER_OF_FALLBACK_LOCALES)中某些元素设置为“default”备用的语言环境的输入法,则进入第二个for循环;这个for循环,不checkDefaultAttribute,
1.这个方法判断输入法是否有子类型支持这个语言环境Locale
1.遍历输入法子类型
2.如果checkCountry,校验子类型的语言和国家
3.子类型的国家和语言校验通过时,校验 requiredSubtypeMode,如果都校验通过则返回true
在Android系统中,输入法的
SubtypeMode
是用来表示输入法子类型的模式。每个输入法子类型都可以有不同的模式,用于定义输入法的行为和功能。
SubtypeMode
的作用是为输入法提供更精细的控制和适应不同的输入场景。它可以影响输入法的键盘布局、输入预测、自动修正、输入法动画等方面的行为。以下是一些常见的
SubtypeMode
及其作用:
SUBTYPE_MODE_KEYBOARD
(键盘模式):这是最常见的输入法子类型模式,用于普通的文本输入。它提供了标准的键盘布局和输入功能。
SUBTYPE_MODE_VOICE
(语音模式):这个模式用于支持语音输入。当输入法处于语音模式时,用户可以通过语音输入来替代键盘输入。
SUBTYPE_MODE_HANDWRITING
(手写模式):这个模式用于支持手写输入。当输入法处于手写模式时,用户可以使用手写笔或手指在屏幕上书写文字。
SUBTYPE_MODE_SYMBOLS
(符号模式):这个模式用于支持符号和特殊字符的输入。当输入法处于符号模式时,键盘上会显示符号和特殊字符,方便用户输入。
SUBTYPE_MODE_NUMBER
(数字模式):这个模式用于支持数字输入。当输入法处于数字模式时,键盘上会显示数字键盘,方便用户输入数字。通过使用不同的
SubtypeMode
,输入法可以根据不同的输入场景提供更好的用户体验和更准确的输入支持。开发者可以根据自己的需求选择适当的SubtypeMode
来配置输入法的行为。