DataBinding 示例中 "com.example.my.app.Fields" 的内容是什么?
what's the content of "com.example.my.app.Fields" in DataBinding example?
当我学习 Android DataBiding 时,页面 Work with observable data objects 告诉我如何使用 ObservableList。
示例代码是:
<data>
<import type="android.databinding.ObservableList"/>
<import type="com.example.my.app.Fields"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[Fields.LAST_NAME]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
但是,“com.example.my.app.Fields”的内容是什么? Fields是一个kotlin"object"?或 Fields 是带有伴随对象的 kotlin class ?
这两个我都试过了,但是得到了同样的数据绑定错误——“Couldn't find accessor xxx.Fields.NAME”。
有没有人能告诉我如何定义字段?非常感谢!
这是我的代码:
activity_temp.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="android.databinding.ObservableArrayList<Object>" />
<import type="com.databinding.ui.Fields" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp">
<!-- When i use android:text="@{user[0]}" ,it's ok -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user[Fields.NAME]}"
tools:text="NAME" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="@{user[1]}"
tools:text="SEX" />
<Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="Click Here" />
</LinearLayout>
</layout>
TempActivity.kt —— .kt class 文件
class TempActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityTempBinding = DataBindingUtil.setContentView(this, R.layout.activity_temp)
val user = ObservableArrayList<Any>().apply {
add("NAME: CnPeng")
add("SEX:Man")
add(17)
}
binding.user = user
var clickCount = 0
binding.bt.setOnClickListener {
clickCount++
user[Fields.NAME] = "NAME: CnPeng, ClickNum:$clickCount"
user[Fields.SEX] = "SEX:Man, ClickNum:$clickCount"
user[Fields.AGE] = clickCount
}
}
}
// Couldn't find accessor xxx.Fields.NAME
//object Fields {
// val NAME: Int = 0
// val SEX: Int = 1
// val AGE: Int = 2
//}
// Couldn't find accessor xxx.Fields.NAME
class Fields {
companion object {
val NAME: Int = 0
val SEX: Int = 1
val AGE: Int = 2
}
}
今天,我解决了。
这样的代码:
// It's ok
//object Fields {
// @JvmField
// val NAME: Int = 0
// @JvmField
// val SEX: Int = 1
// @JvmField
// val AGE: Int = 2
//}
// It's Ok
class Fields {
companion object {
@JvmField
val NAME: Int = 0
@JvmField
val SEX: Int = 1
@JvmField
val AGE: Int = 2
}
}
我在字段上方添加了@JvmField。
因为编译的时候databinding库生成了一个.java class,就是.java文件会调用.kt中的字段,所以,我们需要加注解。
当我学习 Android DataBiding 时,页面 Work with observable data objects 告诉我如何使用 ObservableList。
示例代码是:
<data>
<import type="android.databinding.ObservableList"/>
<import type="com.example.my.app.Fields"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[Fields.LAST_NAME]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
但是,“com.example.my.app.Fields”的内容是什么? Fields是一个kotlin"object"?或 Fields 是带有伴随对象的 kotlin class ?
这两个我都试过了,但是得到了同样的数据绑定错误——“Couldn't find accessor xxx.Fields.NAME”。
有没有人能告诉我如何定义字段?非常感谢!
这是我的代码:
activity_temp.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="android.databinding.ObservableArrayList<Object>" />
<import type="com.databinding.ui.Fields" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp">
<!-- When i use android:text="@{user[0]}" ,it's ok -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user[Fields.NAME]}"
tools:text="NAME" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="@{user[1]}"
tools:text="SEX" />
<Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="Click Here" />
</LinearLayout>
</layout>
TempActivity.kt —— .kt class 文件
class TempActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityTempBinding = DataBindingUtil.setContentView(this, R.layout.activity_temp)
val user = ObservableArrayList<Any>().apply {
add("NAME: CnPeng")
add("SEX:Man")
add(17)
}
binding.user = user
var clickCount = 0
binding.bt.setOnClickListener {
clickCount++
user[Fields.NAME] = "NAME: CnPeng, ClickNum:$clickCount"
user[Fields.SEX] = "SEX:Man, ClickNum:$clickCount"
user[Fields.AGE] = clickCount
}
}
}
// Couldn't find accessor xxx.Fields.NAME
//object Fields {
// val NAME: Int = 0
// val SEX: Int = 1
// val AGE: Int = 2
//}
// Couldn't find accessor xxx.Fields.NAME
class Fields {
companion object {
val NAME: Int = 0
val SEX: Int = 1
val AGE: Int = 2
}
}
今天,我解决了。
这样的代码:
// It's ok
//object Fields {
// @JvmField
// val NAME: Int = 0
// @JvmField
// val SEX: Int = 1
// @JvmField
// val AGE: Int = 2
//}
// It's Ok
class Fields {
companion object {
@JvmField
val NAME: Int = 0
@JvmField
val SEX: Int = 1
@JvmField
val AGE: Int = 2
}
}
我在字段上方添加了@JvmField。
因为编译的时候databinding库生成了一个.java class,就是.java文件会调用.kt中的字段,所以,我们需要加注解。