每个InputType常量的语义是什么?

Dan*_*lme 6 android textview android-input-method

您可以设置TextViewinputType,从值的一个InputType暗示,在键入的文字应该是一个人的名字,电话号码,&C.即使输入方法不遵守此提示,也TextView使用a KeyListener和/或TransformationMethod确保只能输入相关字符,或者具有屏蔽密码等效果.即使是标志也不只是提示:它们可以改变TextView显着的行为(最明显的例子EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE).

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

Dan*_*lme 10

您可以通过检查*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允许您拥有+-,但仅作为第一个字符.添加TYPE_NUMBER_FLAG_DECIMAL让您拥有.任何位置,但只有一次.您可以同时使用signed和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如你所料:它使用a TransformationMethod来模糊键入的字符.

文字类型

TYPE_CLASS_TEXT,设置TYPE_TEXT_VARIATION_EMAIL_ADDRESSTYPE_TEXT_VARIATION_EMAIL_SUBJECT按下回车键将焦点移动到下一个字段而不是插入换行符.

TYPE_TEXT_VARIATION_FILTER 将阻止输入法进入全屏(提取)模式.

TYPE_TEXT_VARIATION_PASSWORD具有明显的效果:它使用a TransformationMethod来模糊键入的字符.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进入单行模式.设置linesmaxLines1只影响显示文本的方式:它并没有启动单行模式.

在单线模式下: -

  • ellipsize选项默认为结束
  • 按Enter键执行"编辑器操作"或将焦点移动到下一个字段(就像上面的电子邮件地址或主题一样); 否则,它会插入换行符
  • 按下选项卡将焦点移动到下一个字段,仅在TYPE_TEXT_FLAG_IME_MULTI_LINE未设置时; 否则它会插入制表符
  • 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(或前面列出的文字变体)会停止拼写检查的文本.这可以防止显示拼写检查建议列表,并且还可以停止突出显示拼写错误的单词.如果选择,输入方法仍然可以提供完成.

其他奇怪的

长按a TextView通常会选择被点击的单词,但如果输入类型是以下之一,则会选择所有文本: -

  • 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