【发布时间】:2020-07-16 08:58:54
【问题描述】:
我有一个 EditText,已经有 inputType 是 number。这确保只能输入来自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",但没有提到如何通过自动将它们转换为 0 和 123 来避免 00 或 0123。
我做了下面的函数,但看起来很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" 中的答案没有帮助,因为它只是阻止用户输入01 和0123,但不会自动将0 更改为@987654340 @当一种类型1。此外,它也不保证EditText什么时候没有,它会自动设置为0。
【问题讨论】:
-
这能回答你的问题吗? How to check if a String is numeric in Java
-
不,那只是将字符串转换为数字。我知道该怎么做。我想即时将我的 edittext 条目更改为合法号码。我使用
doAfterTextChanged,但这会无限调用doAfterTextChanged...所以我需要做一些if-else检查来停止递归运行。看起来很老套 -
我还使用
inputType="number"确保条目绝对是0-9。因此,仅获取数字绝对没有问题。但是,这并不妨碍人们输入00或0123,技术上是一个数字,但它不是任何人都会输入的。 -
我确实认为这是最好的解决方案@Elye,所以感谢它和 Medium 帖子:D