首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android :如何在使用clickListener时从DataBinding中保存Int?

Android :如何在使用clickListener时从DataBinding中保存Int?
EN

Stack Overflow用户
提问于 2022-09-25 13:58:46
回答 1查看 61关注 0票数 0

我正在尝试将我的代码从直接使用.xml文件转换为通过数据绑定工作,但是即使我使用的是.toInt(),我还是会得到NumberFormatException。

这是我最初创建的按钮,它起了作用,并允许我将客户保存到本地db:

代码语言:javascript
复制
    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()

    }

这是我的当前按钮,它适用于数据绑定并在每次单击时崩溃:

代码语言:javascript
复制
        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()
        }
    }

这就是我一直犯的错误:

代码语言:javascript
复制
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 editText中输入了一个数字,但没有转换为string,然后转换为Int。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 17:17:14

如果customerName是EditText,即使使用数据绑定,也必须使用customerName.text获取文本

但是,如果坚持使用数据绑定,则还有另一种方法。

在视图模型中添加以下代码:

代码语言:javascript
复制
@Bindable
var customerName = ""
    set(value) {
        field = value
        notifyPropertyChanged(BR.customerName)
    }

然后,在您的.XML文件中,在客户名称中编辑文本,添加以下内容:

代码语言:javascript
复制
android:text="@={viewModel.customerName}"

要在数据绑定布局中导入视图模型,请使用以下命令:

代码语言:javascript
复制
<data>
    <variable
        name="viewModel"
        type="com.example.viewmodel.mainViewModel" />
</data>

不要使用com.example.viewmodel.mainViewModel,而是使用您自己的地址。现在,每当您在视图模型中更改customerName的值时,您的编辑文本也将被更新,并且每当您在编辑文本中写入文本时,它将存储在视图模型中的customer name变量中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73845081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档