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

时间:2013-10-14 22:00:29

标签: android textview android-input-method

您可以将TextView的{​​{1}}设置为inputType中的一个值,以暗示输入的文字应该是某个人的姓名,电话号码和& c 。即使输入法不遵守此提示,InputType也会使用TextView和/或KeyListener来确保只能输入相关字符,或者具有屏蔽效果的效果密码。即使标志不仅仅是提示:它们可以显着改变TransformationMethod的行为(最明显的例子是TextView)。

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

1 个答案:

答案 0 :(得分:8)

您可以通过检查*KeyListener类的来源找到这一点,但当然这可能会在不同版本或制造商或运营商自定义中进行更改。以下内容基于AOSP 4.3来源。这些只是每种类型对Android本身的影响:输入方法还使用类型作为提示来更好地预测用户可能键入的内容。例如,虽然TYPE_TEXT_VARIATION_PERSON_NAME仅具有禁用拼写检查的效果,但IM可能会通过从常用名字典而不是语言字典中自动完成来响应此类型。

为了试验输入类型和IME选项,我编写了一个快速应用程序,允许您从GUI中的列表中选择它们,因此您不必编辑XML布局并重建应用程序来执行此操作。如果您想了解更多内容,或查看他们与指定IM应用的互动方式,download IM prove free from Google Play

TYPE_NULL

实际记录了这个:

  

这应该被解释为意味着目标输入连接不丰富,它不能处理和显示候选文本之类的东西,也不能检索当前文本,因此输入方法将需要在有限的生成中生成#34;生成关键事件"模式,如果它支持它。请注意,某些输入方法可能不支持它,例如,即使设置了此标志,基于语音的输入方法也可能无法生成键事件。

这使得它听起来像你没有编辑文本的情况,但是按下IM上的按键会直接执行某些操作。但实际上它完全隐藏了IM。从应用程序的角度来看,您几乎从不想要这样:如果您只想让硬件键盘输入文本,请设置它。

从IM的角度来看,您将这种类型传递给onStartInput很多,通常当Android即将隐藏IM时,因为不同的活动即将到来。您希望快速响应此输入类型。它可能有两个原因可以解决这个问题,但参与设计的人必须确认原因: -

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

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

  3. 数字类型

    TYPE_CLASS_NUMBER为您提供数字0-9。此外,添加TYPE_NUMBER_FLAG_SIGNED可让您拥有+-,但只能作为第一个字符。添加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&# 34;,但你可以在任何顺序和位置使用它们。有点不正常,你不能有空间或。为"下午3点"或"下午2点"甚至" 2.30"。同样,它似乎没有被本地化。

    TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_NORMAL可获得0-9以及:/-,空格和amp。这显然不包括.,即使它在约会中被允许。

    根据以上观察,我不能说我建议使用上述任何一类。他们似乎都有重大缺席并阻止本地化。以上是唯一具有字符限制的类。

    TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD按照您的预期执行:它使用TransformationMethod来隐藏键入的字符。

    文字类型

    TYPE_CLASS_TEXT中,设置TYPE_TEXT_VARIATION_EMAIL_ADDRESSTYPE_TEXT_VARIATION_EMAIL_SUBJECT会按下回车键,将焦点移至下一个字段,而不是插入换行符。

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

    TYPE_TEXT_VARIATION_PASSWORD具有明显的效果:它使用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进入单行模式。将linesmaxLines设置为1只会影响文本的显示方式:启动单行模式。

    在单线模式下: -

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

    其他奇怪的事情

    长按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