android - 设置 DigitsKeyListener 时小数分隔键不可见
问题描述
我想允许用户根据区域输入带有小数分隔符(逗号或点)的数字。
现在我正在使用DigitsKeyListener
为某些语言环境(例如波兰、德国)启用逗号作为分隔符。
val separator = DecimalFormatSymbols.getInstance().decimalSeparator
editTextValue.keyListener = DigitsKeyListener.getInstance("-0123456789$separator")
这段代码是用kotlin编写的。
如果软件键盘是Gboard
或其他第三方键盘,那么一切都很好,用户可以使用逗号或点作为分隔符。
但是当用户使用股票键盘并DigitsKeyListener
设置时,并非所有键都可见并且用户无法添加分隔符。
这是我的 EditText 代码:
<android.support.design.widget.TextInputLayout
android:id="@+id/textInput"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
app:hintTextAppearance="@style/Lorin.Theme.TextInputLayout"
app:layout_constraintLeft_toRightOf="@id/imageInfo"
app:layout_constraintRight_toLeftOf="@id/buttonHistoryNumeric">
<android.support.design.widget.TextInputEditText
android:id="@+id/editTextValue"
style="@style/Lorin.EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="flagNavigateNext"
android:inputType="number|numberSigned|numberDecimal"
android:maxLines="1"
tools:hint="Range"/>
</android.support.design.widget.TextInputLayout>
val separator = DecimalFormatSymbols.getInstance().decimalSeparator
//editTextValue.keyListener = DigitsKeyListener.getInstance("-0123456789$separator")
当 line withDigitsKeyListener
被注释时,分隔符的键是可见的,但唯一可用的分隔符是点
你有什么想法如何在股票键盘上使用逗号作为分隔符吗?
解决方案
问题是DigitsKeyListener在将 getInstance 与可接受的字符串一起使用时未指定十进制/签名标志。由于 KeyListener 覆盖了 EditText 的输入类型,因此在设置 KeyListener 之后,您的 EditText 现在具有 inputType number 而不是 numberDecimal 或 numberSigned。
由于 DigitsKeyListener 非常有用,一个简单的解决方法是简单地委托给它,但使用正确的输入类型。在 Kotlin 中,这非常简单:
class DecimalSignedDigitsKeyListener(digitsKeyListener: DigitsKeyListener) :
KeyListener by digitsKeyListener {
override fun getInputType() =
InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL or
InputType.TYPE_NUMBER_FLAG_SIGNED
}
val separator = DecimalFormatSymbols.getInstance().decimalSeparator
val digitsKeyListener = DigitsKeyListener.getInstance("<your digits>")
editTextValue.keyListener = DecimalSignedDigitsKeyListener(digitsKeyListener)
我建议总是接受'。除了任何特定于区域设置的分隔符之外,因为并非所有键盘实际上都会显示逗号或其他符号。
推荐阅读
- c# - 使用 itext7 填充 pdf 表单时调用 FillXfaForm 后,XML 数据集在 xfa.datasetsNode 中重复
- sql - 在 SQL 中为每个 id 引用添加列
- facebook - Facebook 显示页面帖子的权限
- shell - api curl脚本没有给出输出
- flutter - 如何修复 Flutter MaterialApp(not_enough_required_arguments)?
- javascript - 通过 HTML 文件输入上传 PSD/任何 Photoshop 文件不起作用
- mysql - 使用多唯一键插入重复键更新sql时出现死锁
- mysql - 使用内部联接表进行高级搜索
- html - 当两个元素向右浮动时,它们会切换位置
- kubernetes - 设置 Kubernetes - 无法从 Pod 访问 API