简介:

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

1.IME生命周期:


输入法本质就是一个Service,假设用户现在刚刚启动一个APP,焦点首次进入文本编辑框时,Android就会通知Service开始进行初始化,便有了生命周期图中所示的:

  • 首先执行onCreate方法,该方法做了一些字符串变量分隔符的初始化。

  • 其次执行onCreateInputView方法,在要显示用户输入的区域时,Android自带框架会调用这个方法,该方法对inputview进行初始化,读取布局文件信息,设置onKeyboardActionListener,并初始设置keyboard。

  • 然后执行onCreateCandidatesView方法,在要显示一些候选词的视图时由框架调用,和上面的onCreateInputView方法类似,在这里是对candidateview进行初始化。

  • 最后执行onStartInputView方法,将 inputview跟当前的keyboard重新关联起来。

2.Android输入法架构图:


图中一些名词含义解释:

  • IMMS:输入法管理服务InputMethodManagerService
  • IMM:输入法管理 InputMethodManager
  • IMS:输入法服务 InputMethodService

3.框架中部分组件使用

在 Android 系统中,IME 是包含一项特殊 IME 服务的 Android 应用。
应用的清单文件必须声明该服务,请求必需的权限,提供一个与操作 action.view.InputMethod 匹配的 Intent
过滤器,并提供定义 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 设置的 Activity

<!-- 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

android.inputmethodservice 和 android.view.inputmethod 软件包中提供了 IME
专用的类。KeyEvent 类对于处理键盘字符非常重要。

KeyboardView

用于呈现键盘和响应用户输入事件的 View 的扩展。键盘布局由 Keyboard 的实例指定,可以在 XML 文件中定义该实例

BaseInputConnection

定义从 InputMethod
返回到接收其输入的应用的通信渠道。可以使用该类读取光标周围的文本,将文本提交至文本框,然后将原始按键事件发送到应用。应用应扩展该类,而不是实现基接口
InputConnection。

设计输入法界面:

输入视图

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

  • onCreateInputView 创建键盘区域视图,返回 layout 布局.

候选试图

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

  • onCreateCandidatesView 创建候选框区域视图,返回 layout 布局.该视图是非必要的,如果不想显示任何内容可以返回Null,事实上,Null的响应是默认行为,该方法可以不实现。

4.编写一个简单的输入法

在AndroidManifest.xml中:

<!-- 输入法服务 -->
<serviceandroid: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-dataandroid: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>

method.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

浅谈Android输入法(IME)架构相关推荐

  1. 浅谈Android手机cpu架构适配

    常见手机端cpu架构  armeabi  armeabi-v7a arm64-v8a  (x86.x86_64 手机端可以忽略,大都是平板设备) 场景一.只有armeabi-v7a架构的so或包含so ...

  2. 浅谈Android Architecture Components

    浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...

  3. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  4. 浅谈Android SDK开发

    目录 浅谈Android SDK开发 SDK开发的原则 SDK设计 功能与职责边界设计 接口设计 兼容性设计 发布输出设计 SDK文档设计 SDK项目架构 组件化.模块化 统一资源管理 第三方依赖管理 ...

  5. 【ZZ】浅谈大型web系统架构 | 菜鸟教程

    浅谈大型web系统架构 http://www.runoob.com/w3cnote/large-scale-web-system-architecture.html 转载于:https://www.c ...

  6. 五分钟DBA:浅谈伪分布式数据库架构

    [IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以"互联网行业应用最佳实践"为主题,定位于互联网架构设计.应用开发.应用运维 ...

  7. 浅谈Android引用计数(2)

    在浅谈Android引用计数(1)中讲了LightRefBase实现对象计数管理的原理,这篇文章将要分析重量级的引用基类:RefBase的实现和它的作用. 下面是RefBase和相关类的类图: 图中可 ...

  8. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...

  9. android fps 垂直同步,浅谈Android流畅度

    原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...

最新文章

  1. 详解DNS的常用记录(下):DNS系列之三
  2. php 提取全部html标签,php提取html中的img标签
  3. jqGrid细节备注—pager文字的设置,更改默认的提交方式
  4. mac下npm/node的安装和卸载、升级;node、npm升级后最后删掉node_modules重新安装
  5. 解引用NULL为什么会导致程序挂死?
  6. shell脚本统计httpd进程和子进程占用的CPU、内存大小,要求每隔5s统计一次
  7. onepill Android端
  8. jsf刷新页面_JSF页面生命周期管理
  9. 【原创】昆虫棋离线复盘工具v1.5 更新(BoardSpace.net hive games reviewer)
  10. scrollView的简单实现效果(1)
  11. c4d阿诺德渲染器支持a卡吗_C4D常用的4大主流渲染器如何选择与比较 (OC/RS/VR/阿诺德)?...
  12. GD32F103移植FreeRTOS
  13. Cherno C++ P61 C++的命名空间
  14. html5 canvas实现桌面效果,基于html5 canvas实现漫天飞雪效果的方法
  15. Verilog学习之路(11)—事件控制(时间延迟)
  16. dell服务器硬件检测cable,DELL服务器硬件报错解决方法——错误代码寄解决和处理办法...
  17. winform Control与UserControl的区别
  18. 生成帮助文档(html或chm格式)
  19. 图片批量OCR识别--支持各种图片
  20. CMU 15-445/645 数据库系统Lab 1 现代C++练习项目

热门文章

  1. 【洞见趋势】博睿数据创始人兼CTO孟曦东访谈实录:聊聊2023年重要战略技术趋势“可观测性”
  2. 一场官司,终于让人们看清了苹果
  3. 腾讯云服务器使用中遇到的问题
  4. 免费开源JAVA报表工具对比 BIRT报表VS润乾报表之初体验
  5. C#数据库图书管理系统
  6. 原生JS灵魂之问(中),看看你是否熟悉JavaScript?
  7. ANDROID 65536错误
  8. pytorch版训练retinanet-csv数据集
  9. Ubuntu 16.04 tf-faster-rcnn 在CPU下训练数据
  10. HTML5 中的 input 元素的输入类型(type 属性的取值)