我不能在科特林中使用 DataBindingUtil.setContentView()

i can't use DataBindingUtil.setContentView() with kotlin

当我想启动名为 DetailActivity 的新 activity 时,我的应用程序将 crash. 这是我的错误:

      E/AndroidRuntime: FATAL EXCEPTION: main
            Process: com.example.notepad, PID: 4793
            android.content.res.Resources$NotFoundException: String resource ID #0x0
                at android.content.res.Resources.getText(Resources.java:244)
                at androidx.appcompat.widget.ResourcesWrapper.getText(ResourcesWrapper.java:54)
                at android.widget.TextView.setText(TextView.java:3888)
                at com.example.notepad.databinding.ActivityDetailBindingImpl.executeBindings(ActivityDetailBindingImpl.java:115)
                at androidx.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:473)
                at androidx.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:445)
        ...

我认为这与setContentView有关。因为当我使用普通 setContentView 程序时效果很好但是当我使用 DataBindingUtil.setContentView() 我的应用程序 crashs. 这是 DetailActivity:

    import android.content.Context
    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.databinding.DataBindingUtil
    import com.example.notepad.databinding.ActivityDetailBinding

    class DetailActivity : AppCompatActivity() {
        private lateinit var binding: ActivityDetailBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_detail)


            if(intent != null) {
                binding.nameText.text = intent.getStringExtra(EXTRA_NAME)
               binding.ageText.text = intent.getStringExtra(EXTRA_AGE)
            }

        }

这是activity_detail:

    <layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        >
        <data>
            <variable
                name="person"
                type="com.example.notepad.Person" />
        </data>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".DetailActivity">

            <TextView
                android:id="@+id/name_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@{person.name}"/>

            <TextView
                android:id="@+id/age_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@{person.age}"/>

        </LinearLayout>
    </layout>

这是人 class:

class Person(var name: String , var age: Int)

[更新] 当我使用 kolin 时,我的 ActivityDetailBindingImpl 文件在 java 中。可能是这个问题。

正如我的评论中所暗示的,问题应该出在 class class Person(var name: String, var age: Int) 和 xml:

中的绑定
        <TextView
            android:id="@+id/age_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{person.age}"/>

android:text="@{person.age}" 数据绑定框架将在 TextView 中搜索一种方法 setText,该方法接受一个 person.age.class 类型的参数,即 Int。这个方法就是这个 one 并且如您所见,它需要一个资源 ID。

这意味着文本视图将尝试查找 ID 与 Person.age 的值匹配的字符串,根据您的堆栈跟踪,该字符串不存在。

要解决此问题,请将 age 的类型更改为 String 在绑定中使用另一种方法,例如:

    <TextView
        android:id="@+id/age_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{String.valueOf(person.age)}"/>