【问题标题】:How to ensure only legitimate number is entered in EditText如何确保在 EditText 中仅输入合法数字
【发布时间】:2020-07-16 08:58:54
【问题描述】:

我有一个 EditText,已经有 inputTypenumber。这确保只能输入来自0-9 的数字。

    <androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/uiEditTextNumber"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        android:inputType="number"
        android:text="0"
        android:textAlignment="center" />

但是,问题是,用户仍然可以输入000 甚至0123,这看起来不合法。我也想这样,当没有字符时,它会返回0(而不是空白的“”)

我在 Stackoverflow 上搜索,发现大多数问题都围绕将输入限制为使用 android:inputType="number",但没有提到如何通过自动将它们转换为 0123 来避免 000123

我做了下面的函数,但看起来很hacky,我必须手动更改文本并移动光标。

        uiEditTextNumber.doAfterTextChanged {
            if (it.isNullOrBlank()) {
                modifyText("0")
                return@doAfterTextChanged
            }
            val originalText = it.toString()
            try {
                val numberText = originalText.toInt().toString()
                if (originalText != numberText) {
                    modifyText(numberText)
                }
            } catch (e: Exception) {
                modifyText("0")
            }
        }

// ... AND the function

    private fun modifyText(numberText: String) {
        uiEditTextNumber.setText(numberText)
        uiEditTextNumber.setSelection(numberText.length)
    }

有更好的解决方案吗?

注意Is it possible to forbid the first number in a EditText to be "0" 中的答案没有帮助,因为它只是阻止用户输入010123,但不会自动将0 更改为@987654340 @当一种类型1。此外,它也不保证EditText什么时候没有,它会自动设置为0

【问题讨论】:

  • 这能回答你的问题吗? How to check if a String is numeric in Java
  • 不,那只是将字符串转换为数字。我知道该怎么做。我想即时将我的 edittext 条目更改为合法号码。我使用doAfterTextChanged,但这会无限调用doAfterTextChanged ...所以我需要做一些if-else检查来停止递归运行。看起来很老套
  • 我还使用inputType="number" 确保条目绝对是0-9。因此,仅获取数字绝对没有问题。但是,这并不妨碍人们输入000123,技术上是一个数字,但它不是任何人都会输入的。
  • 我确实认为这是最好的解决方案@Elye,所以感谢它和 Medium 帖子:D

标签: android android-edittext


【解决方案1】:

为实现您的目标,您可以添加以下功能

fun removeLeadingZeros(strNumber: String): String {
        for (i in strNumber.indices) {
            val c = strNumber[i]
            if (c != '0') {
                return strNumber.substring(i)
            }
        }
        //If the number consists only from zeros, return zero.
        return "0"
    }

然后,当需要从editText中获取文本时,可以像这样调用函数

str = removeLeadingZeros(strNumber)

【讨论】:

  • 谢谢。什么时候会调用removeLeadingZeros?我上面写的val numberText = originalText.toInt().toString()不就是那种成就吗?抱歉,它仍然不能解决我对不手动破解它的更好方法的询问。
  • 嘿,刚刚更新了我的答案,你可以在需要从editText中获取文本时调用该函数
  • 这不能回答我不使用doAfterTextChanged 的问题。我仍然不得不求助于doAfterTextChanged,这似乎不适合我的情况。
  • 我尝试在谷歌上寻找答案,看起来这个问题可能是重复的。 stackoverflow.com/questions/24406447/…
  • 另外,您没有提到您不想要“在文本更改后执行”,因此我建议您编辑您的问题 ;)
猜你喜欢
  • 2021-05-14
  • 2015-09-29
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
相关资源
最近更新 更多