您可以将TextView
的{{1}}设置为inputType
中的一个值,以暗示输入的文字应该是某个人的姓名,电话号码和& c 。即使输入法不遵守此提示,InputType
也会使用TextView
和/或KeyListener
来确保只能输入相关字符,或者具有屏蔽效果的效果密码。即使标志不仅仅是提示:它们可以显着改变TransformationMethod
的行为(最明显的例子是TextView
)。
Google的文档对每个EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
的实际效果非常模糊。每种情况下实际允许哪些字符?如果有的话,这会因地区而异?即使没有记录的答案,并且它可能在版本之间发生变化,我仍然想知道预期的行为。
答案 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时,因为不同的活动即将到来。您希望快速响应此输入类型。它可能有两个原因可以解决这个问题,但参与设计的人必须确认原因: -
可能是让IM知道编辑在该窗口中完全完成(与onFinishInput
不同,这仅仅意味着IM被隐藏),因此它可以释放用于词典的内存和喜欢直到编辑重新开始。
它可能是允许硬件键盘使用箭头键进行滚动,菜单加速键等的一部分,即使没有文本输入也是如此。
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_ADDRESS
或TYPE_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
进入单行模式。将lines
或maxLines
设置为1只会影响文本的显示方式:不启动单行模式。
在单线模式下: -
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