StupidBeauty
Read times:35637Posted at: - no title specified

安卓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() 来与编辑 器交互。编辑区域 和选中内容二者之间是完全独立的,输入法引擎 可以 按照自认为合适的方式来使用它们。

公有方法

public abstract boolean  commitText  ( CharSequence  text, int newCursorPosition)

自此版本开始引入 应用编程接口级别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)。

public abstract boolean  sendKeyEvent  ( KeyEvent  event)

自此版本开始引入 应用编程接口级别3

向当前通过此输入连接关联起来的进程发送一个按键事件。此事件会被作为一个普通的按键事件发送出去,发送给当前拥有焦点的视图;这通常就是提供了此InputConnection 的那个视图,但是,由于这个协议天生就是异步的,所以,无法完全保证这一点,于是,当这个事件被接收到时,焦点可能已经改变了。

这个方法可用来向应用程序发送按键事件。例如,一个显示于屏幕上的键盘可以使用这个方法来模拟一个硬件键盘。有三种类型的标准键盘:数字(12个键)、预测(20个键) 字母(QWERTY)。妳可以指定该按键事件的设备编号,以这种方法来指定键盘类型。

通常 ,对于 妳通过这个应用编程接口发出的所有按键事件对象, 都要设置标志位 KeyEvent.FLAG_SOFT_KEYBOARD ;别人 不会为妳设置这个标志位。

注意 不建议妳在普通的操作中发送这种按键事件; 这个主要是用于 TYPE_NULL 类型 的文本字段的。 妳应当使用 commitText(CharSequence, int) 那一族方法来向应用程序发送文本。

参数

event

按键事件

返回
  • •.成功则返回真(true),如果该输入连接不再有效,则返回假(false)。

参考

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands