安卓19开发文档翻译:输入法连接,InputConnection
android.view.inputmethod.InputConnection |
InputConnection接口 , 是输入法( InputMethod )与正在接收它的输入的应用程序之间的通信通道。 它被用来做一系列的事情,例如:读取光标附近 的文字; 将文字提交到文本框; 以及,向应用程序发送原始的按键事件。
应用程序 不应当直接实现这个接口, 而应当继承 BaseInputConnection 。 这样就能够确保, 当新的方法被添加到这个接口时,该应用程序不会失效。
文字输入 ,是由两个必需组件协同完成的: 一个输入法引擎(Input Method Engine (IME))和一个编辑器。此处 所说的输入法引擎,可以是: 一个软键盘; 一个手写界面; 一个绘文字画板(emoji palette); 一个语音识别引擎;等等。 在每个安卓设备上,一般都 装有多个输入法引擎。 在安卓系统中,输入法引擎 都是继承自 InputMethodService 。 欲知更多关于如何创建输入法引擎的信息,则阅读 创建 一个输入法 指南。编辑 器 即为 那个 接收文字并且显示 它的组件。 一般情况下,它会是一个 EditText 实例,但是某些应用程序 中可能会由于各种原因而自行实现一个编辑器。 这是一件庞大而复杂的事情, 一个想要做到这一点的应用程序,需要确保 它的行为与安卓中标准EditText 的行为相一致。 编辑器需要 与输入法引擎打交道,通过 这个InputConnection 接口来接收命令, 以及通过 InputMethodManager 来发送命令。作为 一个编辑器,首先应当实现 onCreateInputConnection(EditorInfo) ,用来返回它自己的输入连接。
如果妳正在实现妳自己的输入法引擎,那么,妳需要调用这个接口中的方法来与应用程序交互。别忘记要在多种应用程序中测试妳的输入法引擎,包括浏览器和富文本编辑器,因为,某些应用程序可能会有一些特殊的要求,而妳又需要处理它们。记住,妳的输入法引擎可能并不是文本变更的唯一来源,所以,尽量保守地发送数据,同时要尽量开放地接收数据。
如果 妳正在实现自己的编辑器,那么, 妳需要提供自己的 BaseInputConnection 子类, 以对来自于输入法引擎的命令作出应答。 请确保妳使用 了尽可能多的输入法引擎来测试自己的编辑器,因为它们 的行为可能是多种多样的。另外 要确保使用了多种语言来进行测试,包括中日韩语言以及那些由右向左书写的语言,例如阿拉伯语言,因为 这些语言可能会有不同的输入要求。如果 妳对于某个特定调用下应有的行为有疑问,那么, 请模仿最新安卓版本中默认TextView 的实现,如果 妳想做一些自由发挥的话,请三思而行 ,因为 ,文本编辑 器之间如果有着不同的行为的话,对于用户来说是狠糟糕的一件事情。
在安卓中,光标和选中内容实为同一个东西。“光标”其实是表示着选中内容长度为0这种特殊情况。因此,在本文档中,会将它们当成同义词来使用。如果存在选中内容的话,则,“光标之前” 进行的任意动作都会在选中内容的开头处发生,“光标之后”进行的任意动作都会在选中内容的结尾处发生。
作为 一个编辑器,需要跟踪当前“处于编辑状态”的区域,就像标准 的编辑器部件那样。编辑状态 的内容是以一种特殊的样式表示的:参考 SPAN_COMPOSING 。输入法引擎使用 这个来帮助用户知道他/她们当前应当关注的那一部分文字, 同时使用 setComposingText(CharSequence, int) 、 setComposingRegion(int, int) 和 finishComposingText() 来与编辑 器交互。编辑区域 和选中内容二者之间是完全独立的,输入法引擎 可以 按照自认为合适的方式来使用它们。
自此版本开始引入 应用编程接口级别3
将文字提交到文本框,并且设置新的光标位置。
这个方法,会删除当前编辑文字中的内容,使用此处传入 的CharSequence 替代它,然后按照 newCursorPosition 的值来移动光标。如果 在此方法被调用时没有正在被编辑的文本,则, 新的文本内容会被插入到光标处,并且删除选中内容 中的文本内容。 这个行为相当于调用 setComposingText(text, newCursorPosition) ,然后调用 finishComposingText() 。
调用 此方法,会导致 ,在批量的输入完毕之后,编辑器调用当前输入法引擎的 onUpdateSelection(int, int, int, int, int, int) 方法。 编辑 器作者们 ,请注意, 为了让这件事能够发生, 妳们需要调用 updateSelection(View, int, int, int, int) 以让输入法知道这个变化情况,但是, 要注意, 要等到当前正在进行的批量编辑完成之后再调用。
text |
要提交的文本。这里面可以包含样式。 |
newCursorPosition |
文本周围新的光标位置,以 Java 字符来计数。如果> 0,则,是相对于文本末尾 - 1的;如果<= 0,则,是相对于文本开头的。所以,值为1的话,会将光标移动到刚刚插入文本的位置之后。注意,这意味着,妳无法将光标放置在文本中间,因为编辑器可能会对妳所提交的文本进行修改,这样,就无法准确地指定位置了。 |
•.成功则返回真(true),如果该输入连接不再有效,则返回假(false)。
自此版本开始引入 应用编程接口级别3
向当前通过此输入连接关联起来的进程发送一个按键事件。此事件会被作为一个普通的按键事件发送出去,发送给当前拥有焦点的视图;这通常就是提供了此InputConnection 的那个视图,但是,由于这个协议天生就是异步的,所以,无法完全保证这一点,于是,当这个事件被接收到时,焦点可能已经改变了。
这个方法可用来向应用程序发送按键事件。例如,一个显示于屏幕上的键盘可以使用这个方法来模拟一个硬件键盘。有三种类型的标准键盘:数字(12个键)、预测(20个键)和 字母(QWERTY)。妳可以指定该按键事件的设备编号,以这种方法来指定键盘类型。
通常 ,对于 妳通过这个应用编程接口发出的所有按键事件对象, 都要设置标志位 KeyEvent.FLAG_SOFT_KEYBOARD ;别人 不会为妳设置这个标志位。
注意 , 不建议妳在普通的操作中发送这种按键事件; 这个主要是用于 TYPE_NULL 类型 的文本字段的。 妳应当使用 commitText(CharSequence, int) 那一族方法来向应用程序发送文本。
event |
按键事件。 |
•.成功则返回真(true),如果该输入连接不再有效,则返回假(false)。
Your opinions
HxLauncher: Launch Android applications by voice commands