美文网首页
Jetpact 之 DataBinding

Jetpact 之 DataBinding

作者: 咸死的鱼_O | 来源:发表于2022-01-21 18:21 被阅读0次
    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

    相关文章

      网友评论

          本文标题:Jetpact 之 DataBinding

          本文链接:https://www.haomeiwen.com/subject/vrbjhrtx.html