【发布时间】:2020-07-27 11:25:52
【问题描述】:
大家好,我在两台设备之间遇到问题。
在使用InputType 和KeyListener 的实践中,我正在操作EditText 以使其接收来自数字键盘的逗号和数字(有关更多背景信息,请查看我之前的question)。
使用下面的代码我可以做这样的事情:
editText.setInputType(InputType.TYPE_CLASS_NUMBER + InputType.TYPE_NUMBER_FLAG_DECIMAL);
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789,"));
很遗憾,这不适用于某些设备,例如 Asus ZenPad 8.0 或某些三星。
只有数字键盘不带逗号,因此用户无法单击和使用它,重要的一点是,注释下面的代码行可以正确显示带逗号的键盘。但是通过这样做,他们不再能够在同一个搜索中使用多个逗号。
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789,"));
没有 KeyListener
使用 KeyListener
我还阅读了有关此的 android 文档,上面写着 (source):
用于将文本键事件转换为编辑操作的接口 可编辑类。请注意,在大多数情况下,此接口已 由 InputMethod 定义的一般软输入法取代;它 应该只用于应用程序有自己的情况 屏幕键盘,并且还希望处理硬键盘事件以 匹配它。
软输入法上的按键不需要触发 这个监听器中的方法,实际上不鼓励这样做。这 默认的 android 键盘不会为任何键触发这些 以 Jelly Bean 或更高版本为目标的应用程序,并且只会交付它 对于针对冰淇淋三明治的应用程序的某些按键或 早一点。
所以基本上对于旧版本的 android 这不起作用?如何复制上述行为? (基本上如何使用无限个逗号的数字键盘)
有关更多详细信息,请发表评论,我很乐意回复并添加更多信息!
提前致谢, 贾科莫。
【问题讨论】:
-
“我也阅读了关于这个的 android 文档”——什么是“这个”?它不是
setKeyListener()。我在文档中的任何地方都找不到您引用的部分。 “所以基本上对于旧版本的 android 这不起作用?” - 更多的是你的黑客将是不可靠的。在超过 26,000 种 Android 设备型号(和用户安装的键盘)中,有数十种(如果不是数百种)输入法编辑器。 -
@CommonsWare 嗨,我添加了引用文档的链接,您可以在“(源)”下找到该链接..也是您的忠实粉丝,提前致谢!
-
我无法解释为什么当您在像
targetting Ice Cream Sandwich这样的短语上搜索文档时该页面没有显示。感谢您的链接!无论如何,您的方法都会做出假设。例如,当您请求setInputType(InputType.TYPE_CLASS_NUMBER + InputType.TYPE_NUMBER_FLAG_DECIMAL)时,任何 IME 都不需要在键盘上提供逗号。这取决于 IME 的开发人员。说我的好话不会改变这一点。 :-)(不过,谢谢你的好话!) -
@CommonsWare Okey 我知道 IME 的开发人员可以通过设置某种类型的 InputType 来决定是否显示逗号: InputType 是否总是确定要显示哪个键盘?说了这么多,为什么设置 KeyListener 会改变键盘呢? (我在问题中添加了更多信息,显示了行为方式。如果我仍然不明白或者我之前没有很好地解释过自己,也很抱歉)。
-
"InputType 不是总是决定显示哪个键盘吗?" ——这是一个提示。 IME 的开发人员如何响应提示取决于 IME 的开发人员。 IME 开发人员可能会考虑十进制和千位分隔符,而不是严格地考虑“逗号”。 “话虽如此,为什么设置 KeyListener 会改变键盘?” -- 制造商可能会根据对
EditText的更改为他们自己的IME 添加特殊的钩子,以响应KeyListener。老实说,这是你所看到的事情的一个方面,我没有预料到。
标签: java android android-edittext searchview android-inputtype