7

您可以将TextView's设置inputType为 from 的值之一,InputType以提示输入的文本应该是人名、电话号码等。即使输入法不遵守此提示,也TextView使用 aKeyListener和/或TransformationMethod来确保只能输入相关字符,或者具有屏蔽密码之类的效果。甚至标志也不仅仅是提示:它们可以改变显着的行为TextView(最明显的例子是EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE)。

Google 的文档对每个inputType. 在每种情况下实际上允许使用哪些字符?如果有的话,这如何因地区而异?即使没有记录在案的答案,并且版本之间可能会发生变化,我仍然想知道预期的行为。

4

1 回答 1

12

您可以通过检查*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 时,因为不同的活动正在进入前台。您希望快速响应此输入类型。它以这种方式工作可能有两个原因,但参与设计的人必须确认原因:-

  1. 可能是让 IM 知道在该窗口中编辑已完全完成(与 不同onFinishInput,这仅意味着 IM 被隐藏),因此它可以释放用于字典等的内存,直到重新开始编辑。

  2. 它可能是允许硬件键盘使用箭头键进行滚动、菜单加速键等的一部分,即使没有进行文本输入也是如此。

课程

数值类型

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_ADDRESSTYPE_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进入单行模式。将linesor设置maxLines为 1 只会影响文本的显示方式:它不会启动单行模式。

在单线模式下:-

  • ellipsize 选项默认为 end
  • 按 Enter 执行“编辑器操作”或将焦点移至下一个字段(就像上面的电子邮件地址或主题一样);否则,它会插入一个换行符
  • TYPE_TEXT_FLAG_IME_MULTI_LINE仅当未设置时,按 Tab 将焦点移动到下一个字段;否则它会插入一个制表符
  • 可以imeOptions包含一个“编辑器操作”来替换软键盘上的回车键;在多行模式下,TextView将添加IME_FLAG_NO_ENTER_ACTIONimeOptions
  • 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
于 2013-10-16T15:50:55.373 回答