如何在Android上将EditText键盘设置为仅包含数字?

85

我希望我的 EditText 显示一个只有数字可见,没有其他字符的键盘。

我已经尝试了所有可用的输入方式,但都没有成功。我搜索了一种获取仅包含数字键的键盘的方法,但我只看到了以下参考:

android: inputType = "numberPassword"

但是我希望数字可见,就像这样:(numberPassword)

输入图像描述在此

我已尝试过:

android:digits="0123456789"
android:inputType="phone"

android:inputType="number"
但它看起来像这样:

enter image description here


1
请查看以下链接:https://dev59.com/ll3Ua4cB1Zd3GeqP-Tag#8122968 - MysticMagicϡ
请查看此链接 https://dev59.com/unDXa4cB1Zd3GeqP9S64#54866377 - ucMedia
@ucMedia,你下面的回答是正确的。 - Jorge B.
14个回答

0

Kotlin解决方案:

我在Kotlin中创建了一个扩展来实现这个功能。我尝试了许多方法,甚至使用过滤器,但是Filter存在一些错误,例如在输入时重复相同的文本。

fun EditText.onAfterTextChanged(allowedChars: String, listener: (String) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val input = editable.toString()
            val newValue = replaceInvalidCharacters(input, allowedChars)
            if (newValue != input) {
                setText(newValue)
                setSelection(text.length)
            }
            listener(newValue)
        }

        override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
    })
}

fun replaceInvalidCharacters(value: String, allowedChars: String): String {
    var finalValue = value.replace("\\p{So}+".toRegex(), "") // To remove emojis when copy paste
    if (finalValue.isNotEmpty()) {
        val lastChar = finalValue.last()
        if (!allowedChars.contains(lastChar, false)) {
            finalValue = finalValue.dropLast(1)
        }
    }
    return finalValue
}

您可以在Activity中像下面这样使用它:
editText.onAfterTextChanged(getString(R.string.supported_digits)) { // Here you can pass whatever the digits you want to allow
            val length = it.length
            if (length > 250) { // You can also check how much length to allow
                return@onAfterTextChanged
            }
        }
  • 您可以传递您想允许的任何字符
  • 当输入时,它将过滤表情符号
  • 即使您复制粘贴,它也会删除表情符号
  • 它只允许存在于allowedChars中的字符
  • 它适用于所有Android版本
  • 它将解决带有过滤器的重复文本问题

0

将以下代码放置在您的<EditText>中:

android:digits="0123456789"
android:inputType="phone"

OP特别想要排除,*#,但是这个答案包括了这些字符。 - Josh Correia
@JoshCorreia 这是一个正确的答案,第一行不允许输入这些符号,但软键盘上仍然显示它们,这相当于使用DigitsKeyListener.getInstance("0123456789")作为键监听器。 - Alireza Jamali

-3
在 XML 中的 edittext 标签中:
android:id="@+id/text"

在程序中:

EditText text=(EditText) findViewById(R.id.text);
text.setRawInputType(Configuration.KEYBOARDHIDDEN_YES);

OP不想隐藏键盘。 - Josh Correia

-3

对于 EditText,如果我们指定了:

android:inputType="number"

只能得到数字。但是如果您使用,

android:inputType="phone"

除了数字,它还可以接受特殊字符,如;、/、"等。


OP特别想要排除,*#,但是这个答案包括了这些字符。 - Josh Correia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接