输入法 (IME) 是一种可让用户输入文本的用户控件。Android 提供了一种可扩展的输入法框架,借助该框架,应用可以为用户提供备选输入法,例如屏幕键盘,甚至是语音输入。安装所需的 IME 后,用户可以从系统设置中选择要使用的 IME,并在整个系统中使用该 IME;一次只能启用一个 IME。

要向 Android 系统添加 IME,您需要创建一个包含扩展

本指南涵盖以下内容:

IME 生命周期

在应用清单中声明 IME 组件

IME API

设计 IME 界面

将文本从 IME 发送到应用

使用 IME 子类型

如果您以前没有处理过 IME,则应先阅读入门文章屏幕输入法。

IME 生命周期

下图显示了 IME 的生命周期:

图 1.IME 的生命周期。

以下各部分介绍了如何实现与遵循此生命周期的 IME 相关联的界面和代码。

在清单中声明 IME 组件

在 Android 系统中,IME 是包含一项特殊 IME 服务的 Android 应用。 应用的清单文件必须声明该服务,请求必需的权限,提供一个与操作 action.view.InputMethod 匹配的 Intent 过滤器,并提供定义 IME 特征的元数据。此外,要提供可让用户修改 IME 行为的设置界面,您可以定义一个可通过系统设置启动的“设置”Activity。

以下代码段声明了一项 IME 服务。它请求了 android.view.InputMethod 匹配的 Intent 过滤器,并定义了 IME 的元数据:

下面的代码段声明了 IME 的设置 Activity。它有一个适用于

您还可以让用户能够直接从 IME 界面访问 IME 设置。

输入法 API

IME 的核心部分是一个服务组件,即一个扩展

以下类也很重要:

定义从用于呈现键盘和响应用户输入事件的

设计输入法界面

IME 有两个主要视觉元素:输入视图和候选视图。您只需要实现与您要设计的输入法相关的元素。

输入视图

输入视图是指用户以点击按键、手写或手势的形式输入文本的界面。当 IME 首次显示时,系统会调用

overridefunonCreateInputView():View{returnlayoutInflater.inflate(R.layout.input,null).apply {if(thisisMyKeyboardView){setOnKeyboardActionListener(this@MyInputMethod)keyboard =latinKeyboard

}}}

在此示例中,MyKeyboardView 是

候选视图

候选视图是指 IME 显示可能的字词更正或字词建议供用户选择的界面。在 IME 生命周期中,系统会在准备好显示候选视图时调用

界面设计注意事项

此部分介绍了一些具体的 IME 界面设计注意事项。

处理多种屏幕尺寸

IME 的界面必须能够针对不同的屏幕尺寸进行缩放,并且还必须处理横向和纵向屏幕方向。在非全屏 IME 模式下,留出足够的空间供应用显示文本字段和任何关联的上下文,以使 IME 占用不超过一半的屏幕空间。在全屏 IME 模式下,不存在此问题。

处理不同的输入类型

通过 Android 文本字段,您可以设置特定的输入类型,例如自由格式的文本、数字、网址、电子邮件地址以及搜索字符串。当实现新的 IME 时,您需要检测每个字段的输入类型,并为其提供相应的界面。不过,您无需设置 IME 来检查用户针对输入类型输入的文本是否有效;这项工作由拥有相应文本字段的应用负责。

例如,以下是随 Android 平台提供的拉丁语 IME 针对文本和电话号码输入提供的界面的屏幕截图:

图 2.拉丁语 IME 输入类型。

当输入字段获得焦点并且您的 IME 启动时,系统会调用

int。要针对文本字段的输入类型对其进行测试,请使用常量

inputType and InputType.TYPE_MASK_CLASS

输入类型位模式可以具有以下值之一:

用于输入数字的文本字段。如前面的屏幕截图所示,拉丁语 IME 显示了适用于此类型的字段的数字键盘。用于输入日期和时间的文本字段。用于输入电话号码的文本字段。用于输入所有受支持字符的文本字段。

在测试这些变体时,请务必使用相应的常量遮盖

注意:在您自己的 IME 中,确保在将文本发送到密码字段时对其进行正确处理。在界面中的输入视图和候选视图中隐藏密码。另请注意,您不应将密码存储到设备上。要了解详情,请参阅安全设计指南。

向应用发送文本

当用户使用您的 IME 输入文本时,您可以通过以下方式向应用发送文本:发送各个按键事件,或在应用的文本字段中修改光标周围的文本。在任何一种情况中,您都要使用

修改光标周围的文本

在文本字段中修改现有文本时,可以使用

例如,以下代码段展示了如何将光标左侧的四个字符替换为文本“Hello!”:

currentInputConnection.also {ic:InputConnection->ic.deleteSurroundingText(4,0)ic.commitText("Hello",1)ic.commitText("!",1)}

在提交之前构成文本

如果您的 IME 执行文本预测或需要多个步骤来撰写某个字形或字词,则您可以在文本字段中显示进度(直到用户提交相应字词),然后将部分文本替换为已完成的文本。在将文本传递至

以下代码段展示了如何在文本字段中显示进度:

currentInputConnection.also {ic:InputConnection->ic.setComposingText("Composi",1)ic.setComposingText("Composin",1)ic.commitText("Composing ",1)}

以下屏幕截图显示了这一过程向用户显示的方式:

图 3.在提交之前构成文本。

拦截硬件按键事件

即使输入法窗口未获得明确的焦点,它也会首先接收硬件按键事件,并且可以选择是使用这些事件,还是将其转发到应用。例如,您可能需要使用方向键在界面中导航,以便在构成文本期间选择候选项。您可能还需要点按返回键,以便关闭来自输入法窗口的任何弹出式窗口。

请务必对您不想自行处理的按键调用 super() 方法。

创建 IME 子类型

借助子类型,IME 可以公开多种受支持的输入法和语言。子类型可以代表以下内容:

语言区域,例如 en_US 或 fr_FR。

输入模式,例如语音输入、键盘输入或手写输入。

特定于 IME 的其他输入样式、形式或属性,例如 10 键键盘布局或 QWERTY 键盘布局。

模式基本上可以是任何文本,例如“keyboard”、“voice”等。子类型还可以公开这些模式的组合。

子类型信息用于通知栏中提供的 IME 切换器对话框以及 IME 设置。通过此信息,框架还可以直接调出 IME 的特定子类型。在构建 IME 时,请使用子类型工具,因为它可以帮助用户识别不同的 IME 语言和模式并在它们之间切换。

您可以使用  元素在输入法的某个 XML 资源文件中定义子类型。以下代码段定义了一个具有两种子类型的 IME:用于美国英语语言区域的键盘子类型,以及用于法国法语语言区域的另一种键盘子类型:

为了确保您的子类型在界面中的标签准确无误,请使用 %s 获取与子类型的语言区域标签相同的子类型标签。以下两个代码段演示了此过程。第一个代码段显示了输入法的 XML 文件的一部分:

第二个代码段是 IME 的 strings.xml 文件的一部分。字符串资源 label_subtype_generic(由输入法界面定义用来设置子类型的标签)定义为:

%s

此设置可使子类型的显示名与语言区域设置一致。 例如,在任何英语语言区域中,显示名都是“English (United States)”。

从通知栏中选择 IME 子类型

Android 系统会管理所有 IME 公开的所有子类型。IME 子类型被视为它们所属 IME 的模式。在通知栏中,用户可以为当前设置的 IME 选择一个可用的子类型,如以下屏幕截图所示:

图 4.从通知栏中选择 IME 子类型。

图 5.在系统设置中设置子类型偏好设置。

从系统设置中选择 IME 子类型

用户可以在“系统设置”区域的“语言和输入法”设置面板中控制子类型的使用方式。

图 6.为 IME 选择语言。

在 IME 子类型之间切换

通过在键盘上提供切换键(例如地球形状的语言图标),您可以让用户在多个 IME 子类型之间轻松切换。这样做可以极大地提高键盘的易用性,并且有助于避免导致用户不满。 要启用此类切换,请执行以下步骤:

在输入法的 XML 资源文件中声明 supportsSwitchingToNextInputMethod = "true"。您的声明应类似于以下代码段:

如果该方法返回 true,则显示一个切换键。

当用户点按该切换键时,调用

注意:在 Android 5.0(API 级别 21)之前的版本中,supportsSwitchingToNextInputMethod 属性。如果用户在没有切换键的情况下切换到某个 IME,可能会卡在该 IME 中,无法轻松从中切换出来。

一般 IME 注意事项

在实现 IME 时,还需要考虑以下事项:

为用户提供一种直接通过 IME 界面设置选项的方式。

由于设备上可能安装了多个 IME,因此为用户提供一种可以直接从输入法界面切换到其他 IME 的方式。

快速调出 IME 界面。根据需要预加载或加载任何大型资源,以便用户可以在点按文本字段后立即看到 IME。缓存用于输入法后续调用的资源和视图。

相反,您应在输入法窗口隐藏之后立即释放较大的内存分配,以便应用可以有足够的内存来运行。考虑在 IME 处于隐藏状态几秒钟后使用延迟消息来释放资源。

确保对于与 IME 相关联的语言或语言区域,用户可以输入尽可能多的字符。请注意,用户可能会在密码或用户名中使用标点符号,因此您的 IME 必须提供多种不同的字符,以允许用户输入密码并访问设备。

android 输入法字典_Android输入法-创建输入法相关推荐

  1. android 输入法文本选择功能,Android的文本和输入---创建输入法(一)

    输入法编辑器(IME)是让用户输入文本的控件.Android提供了一个可扩展的的输入法的框架,它允许应用程序给用户提供另外的输入法,如软键盘或语音输入.这些输入法一旦安装,用户就可以从系统的设置中选择 ...

  2. Android Studio模拟器如何设置中文输入法

    很多Android项目的运行都需要用到中文输入法,在一年前的Android Studio需要导入输入法apk安装,现在新版的Android Studio免去了这个麻烦,下面就教大家如何设置谷歌拼音输入 ...

  3. Android TV 源码修改默认输入法

    前一阵子,应泰国客户需求,需要在Android TV系统定制一个多语言输入法,至少支持中.英.泰三种语言.拿到这个任务,对于至今还是小白的我来说,当然先去google一下有没有大神专门做过符合要求的输 ...

  4. android源码问题解答之一(输入法)

    本文将采取问答形式展开,收集的一些平时修改android平台源码遇到的问题.基于展讯平台,别的平台也基本上类似修改即可. case 1:android:imeOptions有什么作用? 曾经出现一个问 ...

  5. android 11.0 12.0第三方输入法app设置系统默认输入法

    1.概述 在11.0 12.0的产品开发中,有功能需要要求设置默认输入法,替换掉系统的输入法,所以这就需要了解设置 输入法的相关功能需求,然后根据输入法包名来设置默认输入法 2.第三方输入法app设置 ...

  6. Android AlertDialog 对话框开启和关闭输入法问题

    Android AlertDialog 对话框开启和关闭输入法问题 AlertDialog 对话框是android jar包自带的对话框,说实话 真的很丑,黑白相间,不是很推荐使用.大多时候 特别是项 ...

  7. Android EditText设置弹出数字输入法键盘

    Android EditText 设置弹出数字输入法键盘 首先设置只能输入数字: <EditText Android:id="@+id/edit_digit_input" a ...

  8. Android 2.2模拟器调出中文输入法

    Android 2.2模拟器调出中文输入法 我目前用的是Android2.2(Google APIs)版本的模拟器,在做一个登录界面时,需要输入中文用户名测试,当时没有调出中文输入法,虽然勾选了&qu ...

  9. android 12.0 第三方输入法app设置系统默认输入法

    1.概述 在12.0的产品开发中,有功能需要要求设置默认输入法,替换掉系统的输入法,所以这就需要了解设置输入法的相关功能需求,然后根据输入法包名来设置默认输入法 2.第三方输入法app设置系统默认输入 ...

  10. android手机软件入门,新手入门Android手机必装软件之输入法篇

    上一期,给大家介绍了Android手机必装软件之美化篇(https://soft.shouji.com.cn/news/407.shtml) , 这期给大家推荐Android平台上的最常用的输入法. ...

最新文章

  1. LeetCode 111. Minimum Depth of Binary Tree--Java, Python解法--二叉树最小高度--迭代,递归
  2. 发布md 的文章测试
  3. 贪心算法+回溯算法+动态规划
  4. 有关Cassandra节点之间的通信:Gossip【译】
  5. oracle mysql增量迁移_深入浅出XTTS:Oracle数据库迁移升级利器
  6. CakePHP中文手册【翻译】-基本概念
  7. python和java的区别-三分钟看懂Python和Java的区别
  8. 线性表的顺序表示---练习题(算法设计题
  9. HttpClient下载图片不完整的解决办法
  10. 【随笔】移动端input type|语义与IOS按键
  11. Ubuntu系统打不开windows磁盘文件
  12. 鲸探APP处罚60余位转售数字藏品用户 | 产业区块链发展周报
  13. 点阵字库(字模)生成器 4.0 TS4
  14. 桌面虚拟化的技术演变发展史
  15. RHCSA之Linux系统简介
  16. 【科技知识】世界量子计算发展史
  17. stc89c51单片机音乐盒系统设计_基于单片机数字音乐盒的设计与实现(附PCB,电路图,程序)...
  18. byte为什么是-128-127
  19. 论文如何快速目录自动生成(wps)
  20. Lind.DDD.Manager里菜单权限的设计

热门文章

  1. CorelDRAW VBA - 发布(导出)PDF文档
  2. 基于复化辛卜生求积公式的变步长求积算法
  3. c++11 日期和时间工具(std::chrono::duration)(二)
  4. debian系统简单介绍
  5. activiti踩坑2-camunda-modeler设计器与activiti7不兼容
  6. 如果有一天,我老无所依,请把我埋在新闻里!
  7. SubmitButton
  8. url“forum.php,如何让discuz论坛首页打开不显示forum.php的方法分享
  9. BZOJ3202 [Sdoi2013]项链
  10. 如何清理多余的Windows桌面右键菜单