[Android]AppCompatEditText限制最多只能输入两位小数

要限制 AppCompatEditText 只能输入两位小数,可以使用 TextWatcher 来实时监控用户输入,并在超出限制时进行处理。以下是如何在 Kotlin 中实现这一功能:

  1. 创建 AppCompatEditText:在 XML 布局中定义 AppCompatEditText,如你所示。

  2. 添加 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 中进行修正,只保留两位小数。
相关推荐
ii_best1 小时前
IOS/ 安卓开发工具按键精灵Sys.GetAppList 函数使用指南:轻松获取设备已安装 APP 列表
android·开发语言·ios·编辑器
2501_915909061 小时前
iOS 26 文件管理实战,多工具组合下的 App 数据访问与系统日志调试方案
android·ios·小程序·https·uni-app·iphone·webview
limingade3 小时前
手机转SIP-手机做中继网关-落地线路对接软交换呼叫中心
android·智能手机·手机转sip·手机做sip中继网关·sip中继
RainbowC03 小时前
GapBuffer高效标记管理算法
android·算法
程序员码歌3 小时前
豆包Seedream4.0深度体验:p图美化与文生图创作
android·前端·后端
、花无将4 小时前
PHP:下载、安装、配置,与apache搭建
android·php·apache
shaominjin1235 小时前
Android 约束布局(ConstraintLayout)的权重机制:用法与对比解析
android·网络
我命由我123456 小时前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
怪兽20147 小时前
请例举 Android 中常用布局类型,并简述其用法以及排版效率
android·面试
应用市场7 小时前
Android Bootloader启动逻辑深度解析
android