Jetpact 之 DataBinding

2022-01-21  本文已影响0人  咸死的鱼_O
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
上一篇下一篇

猜你喜欢

热点阅读