文档章节

Android 输入法详解

冰雪情缘l
 冰雪情缘l
发布于 2017/09/12 01:58
字数 1300
阅读 718
收藏 20
点赞 0
评论 0

我们自己要重写一个简单的输入法确实很简单,但是要写一个输出中文或者五笔等等就比较麻烦。因为你需要引擎,建议使用别人的引擎先进行改造。这篇文章着重是在输入法UI层面上进行讲解,不涉及引擎问题,引擎问题可以查看源码或者网上自行查找学习(或者下一篇文章会推出).

note: 本文章有一些内容是涉及TV端的,本程序猿是一枚android TV开发人员.

 

1. 了解输入法整体的窗口布局.

  • 手机 搜狗输入法 截图:

  • TV端 搜狗输入法 截图:

TV端主要是遥控器操作(上,下,左,右,确定),鼠标也是支持的。

输入法的布局分为两部分,上面为 候选框,下面为 键盘区域.

2. 简单了解下谷歌的输入法

谷歌的输入法是按照MVC模式来写的,输入法的界面 原理很简单,读取XML布局,绘制键盘区域.

  • PinyinIME 为谷歌的拼音输入法。
  • LatinIME 是外文输入法,包含了很多外国的语言。

如果有源码,可以自己看看谷歌的PinyinIME的res\xml 目录下的 xml文件.

然后也可以看看

XmlKeyboardLoader.java 文件 是如何加载并解析XML文件的.

SoftKeyboardView.java 文件是根据解析的XML文件绘制出 键盘区域的.

谷歌PinyinIME源码地址:http://git.oschina.net/kumei/PinyinIME_GOOGLE (可以编译的版本)

3. 如何写一个简单的输入法

谷歌有一套输入法框架,也提供了编写输入法的API,请记住这个类(InputMethodService.java).

InputMethodService 是输入法的关键核心类.

插入一个小插曲,本人以前是搞LINUX桌面开发的,那个时候linux桌面的输入法真的很难用.

Linux的输入法框架有很多,有 SCIM, ibus, Fcitx,大家可以简单的了解下.

后来 搜狗 与 fcitx 合作开发,才有了 搜狗 for linux,真心表示很赞.

关键核心类有几个重要的函数:

  • onCreateCandidatesView 创建 候选框区域视图,一般是返回一个layout布局.
  • onCreateInputView 创建 键盘区域视图,也是一般返回一个layout布局.

看看在 AndroidManifest.xml要如何写.

<!-- 输入法服务 -->
<service
    android:name="com.....自定义InputMethodService"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_INPUT_METHOD" >
    <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>

注意 android:permission 与 action(android.view.InputMethod),还有 meta-data。

  • android:permission="android.permission.BIND_INPUT_METHOD"

        绑定输入法,请求InputMethodService服务,只有系统才能使用。(网上给出的解释)

        而且还是一个你作为输入法的标识.

  • action(android.view.InputMethod)
  • meta-data

再看看 xml 的 method.xml

<input-method xmlns:android="http://schemas.android.com/apk/res/android"
    android:isDefault="true"
    android:settingsActivity="com.....setting.自定义SettingsActivity" />
  • android:settingsActivity 不用多说,就是 输入法设置界面.

input-method 支持很多语法,有兴趣的可以上网查查.

经过上面几个步骤,基本上一个超级简单的输入法就出来了.

给 键盘区域 返回 一个简单的 layout布局(带几个button就OK)

也许你的输入法雏形已经出来了,你会带着好几个疑问与好奇?

1. 输入法 的 文字 如何 输入 到 EditText 的? (看下面的代码)

/**
* 发送字符到编辑框(EditText)
*/
public void commitResultText(String resultText) {
    InputConnection ic = getCurrentInputConnection();
    if (null != ic && !TextUtils.isEmpty(resultText)) {
	    ic.commitText(resultText, 1);
    }
}

2. 是如何根据 EditText 的 一些参数进行设置的?

  • android:inputType 来 如何切换输入法不同的键盘?

        在 InputMethodService 有一个函数 onStartInputView,这个函数

  • android:imeOptions 来显示 下一步,完成,搜索 等等?
  • android:imeActionLabel 如何显示文字在输入法的完成键上的?

3. 输入法是如何不占据全屏的?

InputMethodService 的函数

@Override
public boolean onEvaluateFullscreenMode() {
    return false;
}

4. 输入法是如何使用引擎(中文,五笔等等)的?

5. 输入法上是如何向EditText删除文字的?

6. 输入法是如何向EditText移动光标的?

    why ? 移动光标?这种需求主要是面向TV端的,如何做的,我只能粗暴的贴代码了.

    本来想了几种方式,后来在WPS这种多行文本一测试,很多移动光标的方式都有问题,最后只剩下这种方式最稳妥.

     /**
	 * 输入框的光标向右移动.
	 */
	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);
	}

7. 输入法如何发送按键给EditText?

8. 如何编写与自定义 自己 输入法的XML?

9. 如何绘制漂亮的输入法界面?

 

后续继续完善,还没有写完 .. ... (先休息罗... ...)

 

我的开源项目:

  1. http://git.oschina.net/kumei/OpenInputMethod 一个英文输入法demo,高仿TV端搜狗输入法界面.
  2. http://git.oschina.net/kumei/zhuyin_inputmethod 一个台湾注音输入法,使用的网上的开源注音引擎.

 

© 著作权归作者所有

共有 人打赏支持
冰雪情缘l

冰雪情缘l

粉丝 51
博文 29
码字总数 22447
作品 6
成都
程序员
Android开发之EditText属性详解

1、EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformation...

的书法上的
2014/07/28
0
0
Window attributes属性详解

以下属性以Dialog为例来讲解: <item name="windowBackground"> 窗体的背景 </item> <item name="windowFrame">Dialog 是否有边框 </item> <item name="windowNoTitle">窗体是否有标题</ite......

TedYin
2013/11/22
0
0
Android EditText不弹出输入法总结,焦点问题的总结

看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的时候默认弹出输入法,可以这样设置这个属相:android:windowSoftInputMode=stateVisible,这样就会默认...

带梦想一7飞
2013/07/12
0
0
Android中App安装位置详解

Android应用可以安装在本机自带存储,同时也可以安装到外部存储(SD卡)。自从API 8后也就是Android2.2后,我们能使APK安装到外部存储上。这是一个可选的特性,在工程的manifest文件中可以进...

°me.7
2013/04/17
0
4
Android中EditTex焦点设置和弹不弹出输入法的问题

 今天编程碰到了一个问题:有一款平板,打开一个有EditText的Activity会默认弹出输入法。为了解决这个问题就深入研究了下android中焦点Focus和弹出输入法的问题。在网上看了些例子都不够全面...

新年
2015/11/11
0
0
Android 输入法键盘和activity页面遮挡问题解决

相信大家在开发时会遇到弹出软键盘后,输入框上移就看不到输入框了,其实只要将Webview放到了ScrollView中,将ScrollView改为LinearLayout问题解决了,不会在弹出软键盘后大幅滚动。不过下面...

红豆与绿豆
2015/10/29
0
0
【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/337.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童
2012/03/19
0
0
Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy
06/29
0
0
Android:TextView属性大全

android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) android:autoText 如果设置,将自动执行输入值的拼写纠正...

Xushao
2013/04/03
0
0
android自学笔记《五》——模拟器的使用

一、中文界面设置 1. 单击模拟器屏幕底部的菜单按钮 2.在弹出的主功能表中找到Settings这项进入设置对话框 3.选择Language & keyboard 这项,这样我们就可以设置区域和文字了。 4.这时选择第...

郭子
2012/02/06
0
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect(spawn) 自动化git提交和scp拷贝---centos(linux)

**在进行SCP文件拷贝中,往往需要进行用户密码的输入,即用户交互。若采用自动化脚本的方式进行,则可用以下方式: ** #!/usr/bin/expect #设置参数 set src [lindex $argv 0] set dest [lin...

helplove
3分钟前
0
0
用Build来构建对象的写法

如果一个类的属性过多,用构造器来构建对象很难写,因此我们时用Build方式来构建对象。写法大致如下。 import java.io.Serializable;import java.util.Date;public class Log impleme...

算法之名
6分钟前
0
0
利用 acme.sh 获取网站证书并配置https访问

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.(https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E) 主要步骤: 安装 acme.sh 生成证书 copy 证书到 nginx/ap...

haoyuehong
19分钟前
2
0
微擎框架内如何根据media_id获取到微信图片的路径

微擎的框架内,图片选择后,获取的是那个字符串是media_id,相当于你这张图片在微信的图片服务器里面的id 要求是:获取https://mmbiz.qpic.cn/mmbiz_jpg/…… 微信图片的路径 而微信并没有根据m...

老bia同学
23分钟前
1
0
Spring boot中日期的json格式化

Model 在model层中,类的日期属性上面添加如下注解: @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") 参考 Jackson Date格式化教程...

亚林瓜子
24分钟前
2
0
Eclipse:Failed to load the JNI shared library

1.问题背景: 由于我之前使用jdk1.9学习,当使用Luke的时候发现jdk版本过高,需要向下配置jdk,就向朋友拷了一个安装包。重新配置路径后,便开始报错。 2.问题描述: Failed to load the JNI...

tinder_boy
27分钟前
0
0
少儿学习编程课程是否真的适合七八岁的低龄儿童[图]

少儿学习编程课程是否真的适合七八岁的低龄儿童[图]: 天下熙熙皆为利来,天下攘攘皆为利往。 这几年来,乐高教育机构在国内如同雨后春笋般出现,当然关闭/转手的也很多。从教师角度来看,部...

原创小博客
32分钟前
1
0
ES12-词项查询

1.词项查询介绍 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,...

贾峰uk
40分钟前
2
0
http状态码与ajax的状态值

ajax状态值 1.1 200 & OK:状态请求成功

litCabbage
43分钟前
1
0
iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面EmptyView 沙盒文件浏览与分享调试控...

sunnyaigd
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部