要限制 AppCompatEditText 只能输入两位小数,可以使用 TextWatcher 来实时监控用户输入,并在超出限制时进行处理。以下是如何在 Kotlin 中实现这一功能:
-
创建 AppCompatEditText:在 XML 布局中定义 AppCompatEditText,如你所示。
-
添加 TextWatcher:在代码中为该 AppCompatEditText 添加 TextWatcher,以便在用户输入时进行验证和格式化。
XML 布局:
Kotlin
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/item_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="@color/transparent"
android:gravity="end"
android:hint="请输入"
android:inputType="numberDecimal"
android:textAlignment="textEnd"
android:textColor="#222222"
android:textColorHint="#CCCCCC"
android:textSize="14sp" />
Kotlin 代码:
Kotlin
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatEditText
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val editText = findViewById<AppCompatEditText>(R.id.item_input)
editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (s != null) {
val str = s.toString()
if (str.isNotEmpty()) {
val regex = """^(\d+)(\.\d{0,2})?$""".toRegex()
if (!regex.matches(str)) {
editText.error = "最多只能输入两位小数"
}
}
}
}
override fun afterTextChanged(s: Editable?) {
s?.let {
val str = it.toString()
if (str.isNotEmpty()) {
val regex = """^(\d+)(\.\d{0,2})?$""".toRegex()
if (!regex.matches(str)) {
editText.removeTextChangedListener(this)
var fixedStr = str
if (fixedStr.contains(".")) {
val parts = fixedStr.split(".")
if (parts.size > 1 && parts[1].length > 2) {
fixedStr = "${parts[0]}.${parts[1].substring(0, 2)}"
}
}
editText.setText(fixedStr)
editText.setSelection(fixedStr.length)
editText.addTextChangedListener(this)
}
}
}
}
})
}
}
解释:
1.TextWatcher:
- beforeTextChanged:在文本变化之前调用。
- onTextChanged:在文本变化期间调用。我们在这里进行实时验证。
- afterTextChanged:在文本变化之后调用。如果输入的文本不符合格式,我们进行修正。
2.正则表达式:
- ^(\d+)(\.\d{0,2})?$:用于匹配最多两位小数的数字。
- ^ 和 $ 分别表示字符串的开始和结束。
- (\d+):匹配一个或多个数字。
- (\.\d{0,2})?$:可选地匹配小数点后最多两位数字。
3.错误提示:
- 如果输入不符合格式,我们设置错误提示来提醒用户。
4.修正输入:
- 如果输入不符合格式,我们在 afterTextChanged 中进行修正,只保留两位小数。