http://www.cnmsdn.com/html/201003/1268842609ID2158.html
需要将一个现有的输入法移植到Android平台上去,根据以前的经验来看,Android还没有输入法框架的,开发成本非常高。所幸的是,在1.5版本之后,Android果断的开放了他的IMF,这给了我们很大的鼓舞。
要自己动手写一个输入法,入手的例子可以看他的Sample中的 SoftKeyboard。这个例子其实写的非常的清楚,它也自称这是一个非常完整的输入法实现,虽然只是简单的英文和数字等的输入。
入手的接口是InputMethodService。它是InputMethod的一个完整实现,你可以再在其基础上扩展和定制。他有5个可能我们会非常感兴趣的类。
onInitializeInterface() 看名字就知道,他是在初始化界面的时候被调用,而一般是一位配置文件的更改导致该函数的执行
onBinndInput() 它在另外的客户端和该输入法连接时调用
onStartInput() 这个非常重要的一个回调,它在编辑框中用户已经开始输入的时候调用。比如你点击一个输入框,你需要根据这个输入框的信息,设置输入法的一些特性,这个在 Sample中很有体会
onCreateInputView() onCreateCandidatesView() onCreateExtractTextView() 第一个是返回一个层次性的输入视图,而且只是在第一次这个视图显示的时候被调用。第二个跟第一个是一样的,只不过创建的是候选框的视图。第三个比较特殊,他是在全屏模式下的一个视图。
onStartInputView() 它是在输入视图被显示并且在一个新的输入框中输入已经开始的时候调用。
基本上输入法的定制,都是围绕在这个接口来实现的,它主要提供的是一个基本的用户界面框架(包括输入视图,候选词视图和全屏模式),但是这些都是要实现者自己去定制的。这里的实现是让所有的元素都放置在了一个单一的由InputMethodService来管理的窗口中。他提供了很多的回调API,需要自己去实现。那么一些默认的设置包括:
1. 软键盘输入视图,它通常都是被放置在屏幕的下方。
2. 候选词视图,它通常是放置在输入视图的上面。
3. 当你输入的时候,是改变你的应用程序的界面来适应这些视图的放置规则的。比如你在Android上面输入,编辑框会自动变形腾出一个软键盘的位置来。
再介绍这两个非常重要的视图:
1. 软输入视图。这个是和用户交互的主要发生地:按键,画图或者其他的方式。通常的实现就是简单的用一个视图来处理所有的工作,并且在调用onCreateInputView的时候返回一个新的实例。那么你怎么知道该不该来显示你的输入视图呢,这个可以调用系统的 onEvaluateInputViewShow来测试是否需要,这个是系统根据当前的上下文环境来实现的。所以你的输入法状态改变的时候,就需要调用 updateInputViewShown来重新估计一下。
2. 候选词视图。 当用户输入一些字符之后,输入法可能需要提供给用户一些可用的候选词的列表。这个视图的管理和输入视图不大一样,因为这个视图是非常的短暂的,它只是在有候选词的时候才会被显示。可以用setCandidatesViewShow来设置是否需要显示这个视图。正是因为这个显示的频繁性,所以它一般不会被销毁,而且不会改变你的应用程序的视图。
最后一个最为关键的问题就是文本的产生了,这也是一个IME的最终目的。这个是通过 InputConnection来链接IME和应用程序的。它能够直接产生生的按键信息,或者甚至直接在候选和提交的文本中编辑。当用户在不同的输入目标之间切换的时候,IME会不断的调用onFinishInput() 和 onStartInput()。在这两个函数中,需要反复做的就是复位状态,并且应对新的输入框的信息。
好了,以上就是一个输入法的最最基本的东西了,下面将根据Sample中的SoftKeyboard来说明这些问题。