android的输入法框架
Android输入法架构学习报告

安卓输入法框架(Input Method Framework)IMF 一.输入法框架简介自Android平台 1.5版本以后,Google开放了Android平台输入法框架(InputMethod Framework, IMF) ,IMF是Android平台的特色设计。
它的出现大大推动了不带实体键盘的设备的诞生。
同时,Android平台输入法框架也给出了输入法的开发所需要的接口,为Android平台的输入法提供了可扩展性。
二.输入法框架组成一个IMF结构中包含三个主要的部分:●(输入法服务)input method manager(IMM):管理各部分的交互,是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务,可以通过Context.getSystemService()来获取一个InputMethodManager 的实例。
●(输入法应用)input method(IME):实现一个允许用户生成文本的独立交互模块。
系统绑定一个当前的输入法。
使其创建和生成,决定输入法何时隐藏或者显示它的UI。
同一时间只能有一个IME运行。
●(客户端)client application:通过输入法管理器控制输入焦点和IME的状态。
一次只能有一个客户端使用IME。
输入法整体框架如图1所示:图1.输入法的总体框架2.1 IMM的实现InputMethodManagerService.java 是整个系统当中,一切与输入法有关的地方的总控制中心。
它通过管理下面三个模块来实现系统的输入法框架。
(1)WindowManagerService负责显示输入法,接收用户事件。
(2)InputMethodService输入法内部逻辑,键盘布局,选词等,最终把选出的字符通过commitText 提交出来。
(3)InputManager由UI 控件(View,TextView,EditText 等)调用,用来操作输入法。
android修改默认输入法

android修改默认输⼊法⽅案⼀:adb命令设置?⽅案2:系统配置;⽅案3:调⽤系统API接⼝设置---------------------------adb shell cmdadb rootadb remountadb push xx.apk /system/app---------------------------#Android键盘(AOSP) ~ 系统默认tin/.LatinIME#⾕歌拼⾳输⼊法com.google.android.inputmethod.pinyin/.PinyinIME#⾕歌Gboard输⼊法tin/tinIME#触宝输⼊法国际版com.cootek.smartinputv5/com.cootek.smartinput5.TouchPalIME#Go 输⼊法com.jb.emoji.gokeyboard/com.jb.gokeyboard.GoKeyboard#SwiftKey Keyboard 输⼊法com.touchtype.swiftkey/com.touchtype.KeyboardService#搜狗输⼊法:com.sohu.inputmethod.sogou/.SogouIME#微软必应输⼊法com.bingime.ime/.BingIme---------------------------#显⽰系统安装的输⼊法列表adb shell ime list -s#获取系统默认输⼊法adb shell settings get secure default_input_method#设置系统默认输⼊法adb shell settings put secure default_input_method com.touchtype.swiftkey/com.touchtype.KeyboardService⽰例:设置输⼊法为默认输⼊法adb shell settings put secure default_input_method com.cootek.smartinputv5/com.cootek.smartinput5.TouchPalIME adb shell settings put secure default_input_method com.jb.emoji.gokeyboard/com.jb.gokeyboard.GoKeyboard adb shell settings put secure default_input_method com.touchtype.swiftkey/com.touchtype.KeyboardServiceadb shell settings put secure default_input_method com.sohu.inputmethod.sogou/.SogouIMEadb shell settings put secure default_input_method com.bingime.ime/.BingIme其他:Swype输⼊法 --安装后点击桌⾯相应图标后启⽤该输⼊法,下载中⽂、⽇⽂等语⾔包。
如何进行Android应用的自定义键盘和输入法开发(八)

Android应用的自定义键盘和输入法开发是一个具有一定挑战性的任务,但也是一个充满创造力和乐趣的过程。
在这篇文章中,我们将探讨如何进行Android应用的自定义键盘和输入法开发,带您深入了解这个领域的知识和技术。
一、理解Android键盘和输入法在开始自定义键盘和输入法开发之前,我们首先需要了解Android键盘和输入法的工作原理。
Android中的键盘和输入法是基于InputMethodManager类实现的,通过监听用户的输入行为,将输入内容传递给应用程序。
二、键盘布局设计设计键盘布局是自定义键盘的第一步。
在Android中,键盘布局由一个xml文件定义。
在这个文件中,您可以指定键盘的外观和按键的功能。
您可以选择使用系统提供的键盘布局,也可以根据自己的需求定义一个新的键盘布局。
在设计键盘布局时,需要考虑以下几个方面:1. 键盘的大小和外观:您可以设置键盘的宽度和高度,以及键盘按键的样式和颜色。
2. 键盘按键的功能:您可以给每个按键指定一个功能,例如字母、数字、符号等。
三、输入法服务自定义键盘的下一步是创建一个输入法服务。
输入法服务是一个运行在后台的服务,负责接收用户输入,并将输入内容传递给应用程序。
在创建输入法服务时,您需要实现InputMethodService类,并覆盖其方法来处理用户的输入和键盘事件。
您还可以调用InputMethodManager类的方法来控制键盘的显示和隐藏。
四、输入法界面输入法界面是输入法的可见部分,它允许用户与键盘进行交互。
您可以自定义输入法界面的样式和布局,添加功能和特效。
在创建输入法界面时,您可以使用Android提供的一些UI组件,如EditText、TextView等。
您还可以使用自定义的布局文件来设计输入法界面,以满足您的需求。
五、实现基本功能在自定义键盘和输入法开发中,有一些基本的功能是需要实现的。
其中包括:1. 键盘切换:您可以实现多个键盘布局,并提供一个切换按钮,使用户能够在不同的键盘布局之间进行切换。
Android如何修改默认输入法

Android 如何修改默认输入法一、适用于ICS(android V4.0)之前的版本:1. 安装需要用的默认输入法(.apk)到system/app2. 修改文件frameworks/base/packages/SettingsProvider/res/values/defaults.xml<string name="default_input_method" translatable="false">默认输入法ID</string>红色标记表示输入法ID,比如PinyinIME 为:com.android.inputmethod.pinyin/.PinyinIM E二、适用于ICS、JB、JB2及之后的版本:1. 需要提前将用到的默认输入法(.apk)内置到系统中(请参考如何将APK预置进系统)2. 修改文件mediatek/config/${Project}/ProjectConfig.mk将宏DEFAULT_INPUT_METHOD 的值设置为所需的输入法;比如PinyinIME,则设为:DEFAULT_INPUT_METHOD = com.android.inputmethod.pin yin.PinyinIME这个值是输入法源码中,包含InputMethodService子类的那个包名.实现InputMethodServi ce的子类的类名。
这里比log中打印的完整类名少一个"/",请注意补充说明:上面的修改方法只适用于默认输入法为.android.inputmethod.pinyin/.PinyinIM E这种格式的输入法(即反斜杠后面就是类名的情况),对于com.google.andrtin/tinIME (即反斜杠后面是完整类名的情况),这种情况是不支持修改mediatek/config/${Project}/ProjectConfig.mk里面DEFAULT_INPUT_METHOD的方法来设置默认输入法的。
Android开发中的国际化和本地化支持(六)

Android开发中的国际化和本地化支持随着移动应用的普及,Android平台已成为世界上最受欢迎的移动操作系统之一。
然而,为了在全球范围内获得用户的广泛认同和接受,针对不同语言、文化和地区的国际化和本地化支持成为了Android 开发的重要方面。
国际化是指将应用程序设计得具备适应各种语言和文化的能力。
在Android开发中,国际化支持体现在应用程序的界面、文本、日期和时间等方面。
为了实现国际化支持,开发人员可以使用Android Studio提供的一些工具和技术。
首先,开发人员可以使用字符串资源来实现应用程序的本地化。
Android Studio提供了便捷的方式来管理不同语言版本的字符串资源。
通过将应用程序的文本内容存储在字符串资源文件中,开发人员可以轻松地将应用程序翻译成多种语言。
在不同的语言环境下,应用程序会自动加载对应的字符串资源,并显示适应该语言的文本内容。
其次,开发人员可以使用Android的Locale类来实现对日期、时间和数字等的本地化支持。
Locale类可以帮助开发人员根据不同的语言环境来格式化日期和时间,以及处理数字的本地化显示。
通过使用Locale类,开发人员可以确保应用程序在不同语言环境下对日期、时间和数字的处理方式符合当地的习惯和规范。
除了字符串资源和Locale类外,Android还提供了其他一些工具和技术来支持国际化和本地化。
例如,开发人员可以使用资源限定符来适配不同屏幕尺寸和分辨率的设备,以确保应用程序在不同设备上的布局和界面效果一致。
另外,Android还提供了多语言的输入法框架,开发人员可以通过自定义输入法来实现对多语言的输入支持。
在进行国际化和本地化开发时,有几点需要开发人员特别注意。
首先,开发人员应该设计应用程序的界面和布局方式,以适应不同语言的文本长度和方向。
不同语言的文本长度和方向可能不同,需要留出足够的空间来避免文本溢出或界面错乱的问题。
其次,开发人员应该避免在应用程序中硬编码任何文本内容,而是使用字符串资源和相关技术来实现文本的本地化支持。
如何进行Android应用的自定义键盘和输入法开发(三)

如何进行Android应用的自定义键盘和输入法开发随着移动设备的普及,Android应用的开发需求也越来越多样化。
其中,自定义键盘和输入法的开发是一个越来越受欢迎的领域。
自定义键盘和输入法能够给用户带来更好的使用体验,满足个性化需求。
本文将介绍如何进行Android应用的自定义键盘和输入法开发。
1. 理解Android输入法框架在开始自定义键盘和输入法的开发之前,我们首先需要了解Android输入法框架。
Android输入法框架是一个强大的工具,它提供了丰富的API和接口,使我们能够定制化各种键盘和输入法。
我们可以通过扩展Android输入法框架来创建我们自己的键盘和输入法。
2. 创建自定义键盘布局自定义键盘的第一步是创建一个自定义布局。
我们可以使用XML文件来定义我们的键盘布局。
在布局中,我们可以包括各种按钮、文本框等。
通过合理的布局设计,我们可以实现键盘的各种功能,如数字键盘、符号键盘等。
此外,我们还可以为键盘添加样式和主题,使其更加美观和易于使用。
3. 处理键盘事件在自定义键盘中,键盘事件的处理非常重要。
我们需要在代码中定义各个按键的响应动作。
通过监听按键事件,我们可以实现各种功能,如文本输入、删除字符等。
在处理键盘事件时,我们可以使用Android提供的KeyEvent类来获取按键的信息,如按键码、按键状态等。
通过合理的事件处理,我们能够实现键盘的各种功能,提高用户的使用体验。
4. 创建自定义输入法除了自定义键盘,我们还可以创建自定义输入法。
自定义输入法是一种更加灵活和强大的方式,它可以提供更多个性化的输入功能。
创建自定义输入法的方法与创建自定义键盘类似,只是在布局和事件处理上有所区别。
我们可以在自定义输入法中加入更多的输入选项,如手写输入、语音输入等。
通过灵活运用Android输入法框架,我们能够创建功能丰富、个性化的输入法。
5. 优化用户体验在进行自定义键盘和输入法开发时,我们还需要考虑用户体验的优化。
Android 软键盘盖住输入框的问题

Android 软键盘盖住输入框的问题(摘自:Android 软键盘盖住输入框的问题 - My_苦行僧 - 博客园)当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入。
解决办法:方法一:在你的activity中的oncreate中setContentView之前写上这个代码getWindow().set SoftInputMode(youtParams.SOFT_INPUT_ADJUST_PAN);方法二:在项目的AndroidManifest.xml文件中界面对应的<activity>里加入android:windowS oftInputMode="stateVisible|adjustResize",这样会让屏幕整体上移。
如果加上的是android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。
方法三:把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView 的封装。
这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。
注:方法一和二应该是同一种方法,不过一个是在代码里实现一个是在xml文件里实现。
可能会应为1.5和之前的版本不支持该方法。
但是方法三是肯定没有问题的。
文主要介绍Android中如何解决输入法键盘和activity页面遮挡的问题。
总结:不希望遮挡设置activity属性android:windowSoftInputMode="adjustPan"希望动态调整高度android:windowSoftInputMode="adjustResize"。
如何进行Android应用的自定义键盘和输入法开发(九)

Android应用的自定义键盘和输入法开发是一项非常有挑战性但也非常有意义的工作。
本文将探讨如何进行这一开发,并提供一些有用的技巧和建议。
一、了解Android键盘和输入法基础知识在开始自定义键盘和输入法开发之前,我们需要对Android键盘和输入法的基础知识有一定的了解。
首先,Android的键盘是由系统提供的默认键盘,而输入法则是键盘的一种特殊类型,能够处理用户输入并将其显示在应用程序中的文本框中。
二、自定义键盘的开发1. 创建自定义键盘布局要创建自定义键盘,首先需要创建一个XML布局文件来定义键盘的外观和行为。
在布局文件中,你可以添加按钮、文本框和其他界面元素。
此外,你还可以指定键盘的大小、颜色和字体等属性。
确保布局文件与你的应用程序的样式和主题相匹配,以提供一致的用户体验。
2. 处理键盘事件在自定义键盘的布局文件中,你可以为各个按钮添加相应的点击事件处理程序。
这样,当用户点击某个按钮时,你就可以执行相应的操作。
例如,你可以在点击按钮时将相应的字符添加到文本框中,或者执行其他自定义的操作。
在处理键盘事件时,记住要处理各种不同的按键,包括字母、数字和特殊字符等。
三、自定义输入法的开发1. 创建自定义输入法服务要创建自定义输入法,首先需要创建一个扩展InputMethodService的类。
这个类将负责处理用户的输入和显示相关的界面。
在这个类中,你可以重写各种方法来处理输入法的生命周期事件。
例如,你可以重写onCreateInputView方法来创建输入法的视图,以供用户输入文本。
2. 定义输入法视图在自定义输入法服务类中,你需要定义输入法视图。
输入法视图是输入法界面的核心部分,它负责显示键盘、文本框和其他界面元素。
你可以使用XML布局文件来定义输入法视图的外观和布局。
确保布局文件与你的应用程序的样式和主题相匹配,以提供一致的用户体验。
3. 处理输入法事件在自定义输入法服务类中,你还需要处理输入法事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解读android键盘一:android输入法框架Android的输入法框架比价复杂。
从进程的角度来讲,相关功能主要分布在下面三个位置:客户端应用是一个包含有图形界面的应用,如地址本。
图形界面上包含有能够接收输入的编辑框,如TextView。
输入法模块提供软键盘,将用户在软键盘上的按键输入根据某种算法(如Zi,T9,国笔等)转换成单词,然后传递给客户端应用。
目录development/samples/SoftKeyboard下提供了一个输入法模块实例。
如果想要实现一个中文输入法,可参考这个实例。
平台部分实现一些管理功能,负责装载某个输入法模块,启动,终止该模块等。
相关代码主要位于下面几个位置。
其中,位于3,5,6,7目录下的代码最值得关注。
1.frameworks/base/core/java/com/android/internal/view这个目录下定义了几个重要的idl接口。
IInputMethod.aidl定义了IInputMethod idl接口,用于客户端跨进程操作InputMethod接口。
IInputMethodSession.aidl定义了IInputMethodSession接口,是IInputMethod的辅助接口。
用于客户端跨进程操作InputMethodSession接口。
IInputMethodCallback.aidl定义了一个helper接口,由客户端实现。
IInputMethod.aidl和IInputMethodSession.aidl实例可以分别调用该接口中的不同方法IInputMethodManager.aidl定义了Input Method Manager的service接口。
客户端通过InputMethodManager interface调用这个service。
InputMethodManagerService.java实现了IInputMethodManager.aidl接口IInputMethodClient.aidl定义接口,标识一个Input Method Manager的客户。
这个service在客户端实现,提供给server端调用。
IInputContext.aidl定义了一个接口,由客户端提供InputMethod使用。
InputMethod可以与客户端交互,调用客户端提供的callback。
IInputConnectionWrapper.java实现了IInputContext接口。
IInputContextCallback.aidl定义了一个接口,定义了一组callback函数给IInputContext.aidl实例调用,从客户端返回信息给InputMethod。
InputConnectionWrapper.java实现了IInputContextCallback接口。
2.frameworks/base/services/java/com/android/serverInputMethodManagerService.java实现了IInputMethodManager.aidl接口3.frameworks/base/core/java/android/view/inputmethod这个目录下定义了几个重要的interface和类。
InputMethodManager.java实现了InputMethodManager类。
此类调用IInputMethodManager.aidl接口功能,而IInputMethodManager.aidl接口功能由InputMethodManagerService.java实现,并运行在不同于客户端进程的server进程中。
InputConnection.java定义了InputConnection interface。
InputConnection 接口在输入法和客户端之间建立了一个连接,输入法可以使用该连接获取或发送信息给客户端。
InputConnection实例由客户端创建之后传递给输入法使用。
BaseInputConnection.java实现了InputConnection接口的一个基类: BaseInputConnection。
EditableInputConnection.java实现了一个派生类InputBinding.java定义了类InputBinding,这个类实现了parcelable接口。
这个类的成员变量包含了客户端传向server的信息。
InputMethod.java定义了InputMethod interface。
文件InputMethodService.java中类InputMethodImpl实现了这个接口。
这个接口定义了一套操纵一个输入法的方法。
如,createSession,startInput等。
要编写一个具体输入法的话,就需要派生这个接口。
InputMethodSession.java定义了InputMethodSession接口。
文件InputMethodService.java中类InputMethodSessionImpl实现了这个接口。
InputMethodSession是InputMethod的辅助接口,用于具体和某个输入法客户端交互。
CompletionInfo.java类描述一个text completion.EditorInfo.java类描述一个接收输入的view的属性,如内容属性(text,digit,etc)。
ExtractedText.java类描述从view中提取的传递给输入法的文本属性。
4.frameworks/base/core/java/com/android/internal/widgetEditableInputConnection.java实现了BaseInputConnection的一个派生类。
5.frameworks/base/core/java/android/inputmethodservice这个目录下的代码提供了实现一个具体输入法的框架类。
从这些类派生,就可以定制一个输入法。
SoftInputWindow.java中的SoftInputWindow类是一个Dialog子类。
它代表一个输入法的顶级窗口(由窗口管理器管理),这个窗口由上到下,包含extractArea,candidatesArea,和inputArea。
Keyboard.java中的Keyboard类装载并解析一个描述虚拟键盘(Soft Keyboard)的xml文件(如development/samples/SoftKeyboard/res/xml),并存储该键盘的属性,如该虚拟键盘包含多上行,每行有哪些键等。
KeyboardView.java中的KeyboardView类是一个View子类。
它根据Keyboard 数据结构真正的在screen上画出一个虚拟键盘。
这个虚拟键盘就是SoftInputWindow中的inputArea。
AbstractInputMethodService是Service的派生类,并实现了KeyEvent.Callback接口。
实现了InputMethod和InputMethodSession的基类。
dispatchKeyEvent函数将收到的key event传给相应的key处理函数(在派生类中实现)。
当这个service被客户端绑定时,其onBind()函数给客户端返回了一个IInputMethodWrapper实例,这个实例实现了IInputMethod idl接口。
客户端可以使用该接口的相关功能。
IInputMethodWrapper.java实现了IInputMethod idl接口。
这个类收到客户端的跨进程命令后,调用InputMethod完成相应功能。
IInputMethodSessionWrapper.java实现了IInputMethodSession idl接口。
这个类收到客户端的跨进程命令后,调用InputMethodSession完成相应功能。
6.frameworks/base/core/res/res/layout这个目录下存放着一些系统资源。
其中,input_method.xml描述了一个输入法的窗口(即SoftInputWindow)布局,从上往下,依次排列extractArea,candidatesArea和inputArea。
input_method_extract_view.xml。
7.development/samples/SoftKeyboard这个目录下代码实现了一个的输入法实例--软键盘英文/数字输入法。
这里面实现的类大都是从frameworks/base/core/java/android/inputmethodservice中的类派生而来。
AndroidManifest.xml:描述这个.apk提供的service以及关于这个输入法的一些信息。
res/xml/目录下存储着几个描述不同虚拟键盘的xml文件。
LatinKeyboard.java中的LatinKeyboard类是Keyboard的子类。
LatinKeyboardView.java中的LatinKeyboardView类是KeyboardView的子类。
8.frameworks/base/core/java/android/widget在这里TextView.java是使用Input Method Framework(IMF)的客户端。
TextView创建了一个InputMethodManager的实例并调用其restartInput函数。
InputMethodManager::restartInput函数创建了一个InputConnection实例并调用IInputMethodManager::startInput。
IInputMethodManager::startInput函数使用mContext.bindService启动一个InputMethod service,如Sample Soft Keyboard。
9.frameworks/base/core/java/com/android/internal/widget#########################################################IMF是input method framework的简称,它是Android1.5新添加进去的一个重要功能,用来支持软键盘、各种的输入法。
到目前位置(2009-04-03),Android1.5还没有正式发布,但IMF的功能已经很稳定,其上已经存在有3种输入法。