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
相关产品推荐
相关产品推荐

