将 Int 绑定到 TextView 时的 ResourcesNotFoundException

out*_*tis -1 data-binding android kotlin

Int值绑定到 aTextView会导致Resources$NotFoundException带有消息“字符串资源 ID #0x2a”(其中0x2a是 的值Int)。为什么会发生这种情况,如何解决?

示例代码: * layout/activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools">

        <data>
            <variable name="data" type="com.example.Thing" />
        </data>

        <LinearLayout tools:context=".MainActivity">
            <TextView android:text="@{data.x}"/>
        </LinearLayout>
    </layout>
Run Code Online (Sandbox Code Playgroud)
  • 东西.kt:

    package com.example
    
    data class Thing(
        var x:Int = 42
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 主活动.kt:

    package com.example
    
    import android.databinding.DataBindingUtil
    import android.os.Bundle
    import android.support.v7.app.AppCompatActivity
    import com.example.databinding.ActivityMainBinding
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            var activityMain:ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
            activityMain.data = Thing()
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

out*_*tis 6

TextView.setText(int),它是在数据绑定被添加到 Android 之前创建的,将其参数解释为资源标识符。要将整数绑定到 TextView,请使用Integer.toString(int)或转换该值String.valueOf(int)Int.toString显然不可用,因为该值已取消装箱):

    <TextView android:text="@{Integer.toString(data.x)}"/>
Run Code Online (Sandbox Code Playgroud)

如果TextView.setText(int)不存在,您还可以编写一个绑定适配器来自动在绑定值类型和View显示类型之间进行转换。