DataBinding的意义:
- 让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低
DataBinding使用:
build.gradle中配置
buildFeatures {
dataBinding true
}
布局文件:
可使用快捷生成databinding模板代码
鼠标放到布局文件内容首位alt +enter
image.png
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="com.example.composedemo.User" />
<variable
name="eventhandlelistener"
type="com.example.composedemo.EventHandleListener" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Test2Activity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="60dp"
android:text="点赞"
android:onClick="@{eventhandlelistener.onButtonClick}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent" />
<include
layout="@layout/sub"
app:user = "@{user}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
include 二级布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.example.composedemo.User" />
<import type="com.example.composedemo.ScoreUtil"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/scoreView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ ScoreUtil.getScoreName(user.score) }"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
该布局包含二级页面引用,
<variable> 标签 作用引入对象
name="user" 对象名称
type="com.example.composedemo.User" 对象地址
<import>标签 作用导入工具类可直接使用的静态方法
activity 中使用
class Test2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var dataBinding: ActivityTest2Binding =
DataBindingUtil.setContentView(this, R.layout.activity_test2)
var user = User("小美",3)
// <variable
// name="user"
// type="com.example.composedemo.User" />
dataBinding.user = user //对应xml定义的对象名
//button 点击事件的处理类和User类似
dataBinding.eventhandlelistener = EventHandleListener(this)
}
}
点击事件处理类:
class EventHandleListener(var context: Context) {
fun onButtonClick(view:View){
Toast.makeText(context,"点赞",Toast.LENGTH_LONG).show()
}
}
在xml中的使用就是: android:onClick="@{eventhandlelistener.onButtonClick}"
评分显示处理类:
object ScoreUtil {
@JvmStatic
fun getScoreName(score: Int): String {
return when (score) {
1 -> "一星"
2 -> "二星"
3 -> "三星"
4 -> "四星"
5 -> "五星"
else -> {
"未评级"
}
}
}
}
在xml中的使用就是: android:text="@{ ScoreUtil.getScoreName(user.score) }"
针对二级页面的对象数据传递定义:
在二级页面定义
<variable
name="user"
type="com.example.composedemo.User" />
父页面使用: app:user = "@{user}"
此处的app:user 命名对应二级页面对象的命名( <variable>中的name值)
二级页面的使用就可以和父页面的使用方法一样
image.png
网友评论