首页 > 解决方案 > 设置 DigitsKeyListener 时小数分隔键不可见

问题描述

我想允许用户根据区域输入带有小数分隔符(逗号或点)的数字。

现在我正在使用DigitsKeyListener为某些语言环境(例如波兰、德国)启用逗号作为分隔符。

val separator = DecimalFormatSymbols.getInstance().decimalSeparator
editTextValue.keyListener = DigitsKeyListener.getInstance("-0123456789$separator")

这段代码是用编写的。

如果软件键盘是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被注释时,分隔符的键是可见的,但唯一可用的分隔符是 带分隔键的键盘

你有什么想法如何在股票键盘上使用逗号作为分隔符吗?

标签: androidkotlinandroid-edittext

解决方案


问题是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)

我建议总是接受'。除了任何特定于区域设置的分隔符之外,因为并非所有键盘实际上都会显示逗号或其他符号。


推荐阅读