You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:使用DataBinding时点击监听保存Int遇NumberFormatException问题

问题:DataBinding下转换输入框内容为Int时出现NumberFormatException

我正尝试将代码从直接操作.xml文件改为通过DataBinding实现,但即使使用了.toInt(),仍出现NumberFormatException。

最初的按钮代码可正常保存客户到本地数据库:

btn_save_customer.setOnClickListener {

    val customerName = customer_name.text.toString()
    val customerAge = customer_age.text.toString().toInt()

    mainViewModel.addCustomer(customerName, customerAge) // this saves the customer to db

    customer_name.text.clear()
    customer_age.text.clear()

}

当前使用DataBinding的按钮代码每次点击都会崩溃:

binding.apply {

    btnSaveCustomer.setOnClickListener {
        val customerNameTxt = customerName.toString()
        val customerAgeTxt = customerAge.toString().toInt()

        mainViewModel.addCustomer(customerNameTxt, customerAgeTxt) // this saves the customer to db

        customerName.clearAnimation()
        customerAge.clearAnimation()
    }
}

报错信息:

java.lang.NumberFormatException: For input string: "androidx.appcompat.widget.AppCompatEditText{4358b5e VFED..CL. .F...... 30,297-690,393 #7f08008e app:id/customer_age aid=1073741825}"
    at java.lang.Integer.parseInt(Integer.java:615)
    at java.lang.Integer.parseInt(Integer.java:650)
    at com.example.observertest.MainActivity.onCreate$lambda-2$lambda-1(MainActivity.kt:57)
    at com.example.observertest.MainActivity.$r8$lambda$yqaLK6RPkbxnU-obodzyYhUCsqM(Unknown Source:0)
    at com.example.observertest.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
    at android.view.View.performClick(View.java:7448)
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
    at android.view.View.performClickInternal(View.java:7425)
    at android.view.View.access$3600(View.java:810)
    at android.view.View$PerformClick.run(View.java:28309)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7698)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)

我确认已在customerAge输入框中输入数字,但仍无法将其转为字符串再转Int,请问问题出在哪里?


解决方法

问题核心是你直接调用了customerName和customerAge(DataBinding生成的EditText实例)的.toString()方法,而不是获取输入框内的文本内容。从报错信息能看到,你尝试转换的字符串是AppCompatEditText对象的默认toString输出,根本不是你输入的数字内容。

修改代码,先获取输入框的text属性再转字符串即可:

binding.apply {
    btnSaveCustomer.setOnClickListener {
        // 获取输入框文本内容再转字符串
        val customerNameTxt = customerName.text.toString()
        // 先获取文本,再转为Int
        val customerAgeTxt = customerAge.text.toString().toInt()

        mainViewModel.addCustomer(customerNameTxt, customerAgeTxt)

        // 清空输入框内容,用text.clear()替代clearAnimation()(后者是清除动画的方法)
        customerName.text.clear()
        customerAge.text.clear()
    }
}

额外建议:为了避免用户输入非数字内容导致崩溃,最好添加异常处理或输入验证:

val ageStr = customerAge.text.toString()
val customerAgeTxt = try {
    ageStr.toInt()
} catch (e: NumberFormatException) {
    // 处理输入非数字的情况,比如提示用户或设置默认值
    0
}

内容的提问来源于stack exchange,提问作者ezcorp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:50:44