我不能在科特林中使用 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)}"/>
当我想启动名为 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)}"/>