浅谈Android输入法(IME)架构
简介:
输入法 (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)架构相关推荐
- 浅谈Android手机cpu架构适配
常见手机端cpu架构 armeabi armeabi-v7a arm64-v8a (x86.x86_64 手机端可以忽略,大都是平板设备) 场景一.只有armeabi-v7a架构的so或包含so ...
- 浅谈Android Architecture Components
浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...
- 浅谈Android中的MVP与动态代理的结合
浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...
- 浅谈Android SDK开发
目录 浅谈Android SDK开发 SDK开发的原则 SDK设计 功能与职责边界设计 接口设计 兼容性设计 发布输出设计 SDK文档设计 SDK项目架构 组件化.模块化 统一资源管理 第三方依赖管理 ...
- 【ZZ】浅谈大型web系统架构 | 菜鸟教程
浅谈大型web系统架构 http://www.runoob.com/w3cnote/large-scale-web-system-architecture.html 转载于:https://www.c ...
- 五分钟DBA:浅谈伪分布式数据库架构
[IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以"互联网行业应用最佳实践"为主题,定位于互联网架构设计.应用开发.应用运维 ...
- 浅谈Android引用计数(2)
在浅谈Android引用计数(1)中讲了LightRefBase实现对象计数管理的原理,这篇文章将要分析重量级的引用基类:RefBase的实现和它的作用. 下面是RefBase和相关类的类图: 图中可 ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...
- android fps 垂直同步,浅谈Android流畅度
原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...
最新文章
- 详解DNS的常用记录(下):DNS系列之三
- php 提取全部html标签,php提取html中的img标签
- jqGrid细节备注—pager文字的设置,更改默认的提交方式
- mac下npm/node的安装和卸载、升级;node、npm升级后最后删掉node_modules重新安装
- 解引用NULL为什么会导致程序挂死?
- shell脚本统计httpd进程和子进程占用的CPU、内存大小,要求每隔5s统计一次
- onepill Android端
- jsf刷新页面_JSF页面生命周期管理
- 【原创】昆虫棋离线复盘工具v1.5 更新(BoardSpace.net hive games reviewer)
- scrollView的简单实现效果(1)
- c4d阿诺德渲染器支持a卡吗_C4D常用的4大主流渲染器如何选择与比较 (OC/RS/VR/阿诺德)?...
- GD32F103移植FreeRTOS
- Cherno C++ P61 C++的命名空间
- html5 canvas实现桌面效果,基于html5 canvas实现漫天飞雪效果的方法
- Verilog学习之路(11)—事件控制(时间延迟)
- dell服务器硬件检测cable,DELL服务器硬件报错解决方法——错误代码寄解决和处理办法...
- winform Control与UserControl的区别
- 生成帮助文档(html或chm格式)
- 图片批量OCR识别--支持各种图片
- CMU 15-445/645 数据库系统Lab 1 现代C++练习项目
热门文章
- 【洞见趋势】博睿数据创始人兼CTO孟曦东访谈实录:聊聊2023年重要战略技术趋势“可观测性”
- 一场官司,终于让人们看清了苹果
- 腾讯云服务器使用中遇到的问题
- 免费开源JAVA报表工具对比 BIRT报表VS润乾报表之初体验
- C#数据库图书管理系统
- 原生JS灵魂之问(中),看看你是否熟悉JavaScript?
- ANDROID 65536错误
- pytorch版训练retinanet-csv数据集
- Ubuntu 16.04 tf-faster-rcnn 在CPU下训练数据
- HTML5 中的 input 元素的输入类型(type 属性的取值)