您可以通过检查*KeyListener
类的来源找到这一点,当然这可能会在不同的版本或制造商或运营商的定制中发生变化。以下内容基于 AOSP 4.3 源代码。这些只是每种类型对 Android 本身的影响:输入法还使用类型作为提示来更好地预测用户可能键入的内容。例如,虽然TYPE_TEXT_VARIATION_PERSON_NAME
只有禁用拼写检查的效果,但 IM 可能会通过从常用名称字典而不是语言字典自动完成来响应这种类型。
为了试验输入类型和 IME 选项,我开发了一个快速应用程序,可让您从 GUI 的列表中选择它们,因此您不必编辑 XML 布局并重新构建应用程序来执行此操作。如果您想了解更多信息,或检查他们如何与给定的 IM 应用程序交互,请从 Google Play 免费下载IM 证明。
TYPE_NULL
这实际上是记录在案的:
这应该解释为目标输入连接不丰富,它不能处理和显示候选文本之类的东西,也不能检索当前文本,因此输入法将需要在有限的“生成键事件”模式下运行,如果它支持它。请注意,某些输入法可能不支持它,例如,即使设置了此标志,基于语音的输入法也可能无法生成按键事件。
这听起来像是您不编辑文本的情况,但在 IM 上按一个键将直接执行一些操作。但实际上它完全隐藏了 IM。从应用程序的角度来看,您几乎不需要这样:如果您只希望硬件键盘能够输入文本,请设置它。
从 IM 的角度来看,你会得到onStartInput
很多这种类型,通常是在 Android 即将隐藏 IM 时,因为不同的活动正在进入前台。您希望快速响应此输入类型。它以这种方式工作可能有两个原因,但参与设计的人必须确认原因:-
可能是让 IM 知道在该窗口中编辑已完全完成(与 不同onFinishInput
,这仅意味着 IM 被隐藏),因此它可以释放用于字典等的内存,直到重新开始编辑。
它可能是允许硬件键盘使用箭头键进行滚动、菜单加速键等的一部分,即使没有进行文本输入也是如此。
课程
数值类型
TYPE_CLASS_NUMBER
给你数字0-9。此外,添加TYPE_NUMBER_FLAG_SIGNED
可以让您拥有+
or -
,但只能作为第一个字符。添加TYPE_NUMBER_FLAG_DECIMAL
可以让您.
处于任何位置,但只有一次。您可以同时使用有符号和十进制。据我所知,这不是本地化的,因此即使对于.
千位分隔符和,
小数点的语言环境或具有不同数字字符的语言环境,允许的字符也是相同的。
TYPE_CLASS_PHONE
让你有数字0-9,以及任何#*+-(),/N.;
和空格。您可以按任意顺序和任意次数使用这些字符:没有格式检查。
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE
让您拥有数字 0-9 以及/-.
. 同样,没有额外的格式检查,因此您可以按任何顺序使用它们。
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME
让您拥有 0-9 以及:
任何数字amp
(用于书写“am”或“pm”,但您可以按任何顺序和位置使用它们)。有点反常,你不能有空间或。对于“下午 3 点”或“下午 2 点”甚至“2.30”。同样,它似乎没有本地化。
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_NORMAL
为您提供 0-9 以及:/-
、 空间和amp
. 这显然不包括.
,即使它在日期中被允许。
基于上述观察,我不能说我会推荐使用上述任何类。他们似乎都有重大缺席并阻止本地化。以上是唯一有字符限制的类。
TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD
正如您所期望的那样:它使用 aTransformationMethod
来掩盖键入的字符。
文本类型
在TYPE_CLASS_TEXT
中,设置TYPE_TEXT_VARIATION_EMAIL_ADDRESS
或TYPE_TEXT_VARIATION_EMAIL_SUBJECT
按下回车键将焦点移动到下一个字段,而不是插入换行符。
TYPE_TEXT_VARIATION_FILTER
将阻止输入法进入全屏(提取)模式。
TYPE_TEXT_VARIATION_PASSWORD
有明显的效果:它使用 aTransformationMethod
来掩盖键入的字符。TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
仍然使用TransformationMethod
来防止文本被复制
TYPE_TEXT_FLAG_NO_SUGGESTIONS
如果未设置,则以下所有文本变体都允许进行拼写检查。也就是说,使用不在此列表中的类TYPE_CLASS_TEXT
或不在TYPE_TEXT_FLAG_NO_SUGGESTIONS
此列表中的变体与设置(稍后描述)具有相同的效果。
TYPE_TEXT_VARIATION_NORMAL
TYPE_TEXT_VARIATION_EMAIL_SUBJECT
TYPE_TEXT_VARIATION_LONG_MESSAGE
TYPE_TEXT_VARIATION_SHORT_MESSAGE
TYPE_TEXT_VARIATION_WEB_EDIT_TEXT
标志
的存在或不存在InputType.TYPE_TEXT_FLAG_MULTI_LINE
具有不明显的副作用。如果类型类不是 TYPE_CLASS_TEXT
,则始终好像未设置标志,并且TextView
进入单行模式。将lines
or设置maxLines
为 1 只会影响文本的显示方式:它不会启动单行模式。
在单线模式下:-
- ellipsize 选项默认为 end
- 按 Enter 执行“编辑器操作”或将焦点移至下一个字段(就像上面的电子邮件地址或主题一样);否则,它会插入一个换行符
TYPE_TEXT_FLAG_IME_MULTI_LINE
仅当未设置时,按 Tab 将焦点移动到下一个字段;否则它会插入一个制表符
- 可以
imeOptions
包含一个“编辑器操作”来替换软键盘上的回车键;在多行模式下,TextView
将添加IME_FLAG_NO_ENTER_ACTION
到imeOptions
maxLines
自动设置为 1
- 在字段中添加换行符(例如使用
setText
)无效,并且回车被替换为零宽度空格(U + FEFF)
TYPE_TEXT_FLAG_CAP_*
用于TextUtils.getCapsMode
决定是否将每个字符大写。这些规则有点巴洛克风格,并且对语言环境不敏感。AFAICT,这只有在默认键盘中启用了相应的设置后才会生效。
设置时TYPE_TEXT_FLAG_AUTO_CORRECT
,空格、制表符、换行符、任何 Unicode“结束标点”字符或任何一个,.!?"
都将触发前面单词的自动更正(在这种情况下,这是最长的 Unicode 字母和撇号序列)。如果整个单词没有更正,它会继续用较短的子序列重试。更正来自固定的系统资源com.android.internal.R.xml.autotext
,并且独立于任何配置的拼写检查器。
TYPE_TEXT_FLAG_NO_SUGGESTIONS
(或前面列出的文本变体)停止对文本进行拼写检查。这可以防止显示拼写检查建议列表,并阻止突出显示拼写错误的单词。如果选择,输入法仍然可以提供补全。
其他怪事
长按 aTextView
通常会选择轻按的单词,但如果输入类型是以下之一,则会选择所有文本:-
TYPE_CLASS_NUMBER
TYPE_CLASS_PHONE
TYPE_CLASS_DATETIME
(任何变化)
TYPE_TEXT_VARIATION_URI
TYPE_TEXT_VARIATION_EMAIL_ADDRESS
TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS
TYPE_TEXT_VARIATION_FILTER