DataBinding的意义与作用

最开始学的时候不要将DataBinding+ViewModel+LiveData连起来使用,先从最简单的单个DataBinding开始学

DataBinding让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低。

这是一个简单的小例子,为了尽可能的展示全面的代码,所以除了ActivityMain.class之外还有俩类 一个是Idol(显示明星的姓名和星级),另一个是PushButtonSayHello(点击按钮,调用这里面的方法弹出Toast)。

 

 

要使用DataBinding就得先在build.gradle中的android中写一句话

 

dataBinding{
        enabled true
    }

 

然后在布局文件中点一下小灯泡,转换一下布局

Idol类:

public class Idol {

    public String name;
    public String star;

    public Idol(String name, String star) {
        this.name = name;
        this.star = star;
    }

    public String myGetStar() {
        return star;
    }
}
PushButtonSayHello类:
public class PushButtonSayHello {

    private Context context;

    public PushButtonSayHello(Context context) {
        this.context = context;
    }

    //别忘了加View,因为是给onClick用的嘛
    public void sayHello(View view){
        Toast.makeText(context, "你好啊", Toast.LENGTH_SHORT).show();
    }

}

activity_main.xml

<?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="idol"
            type="com.example.lifecycle.Idol" />
        <!--  第二个类 点击按钮 弹出Toast-->
        <variable
            name="PushButton"
            type="com.example.lifecycle.PushButtonSayHello" />
        <!-- 想用这个类里面的静态方法就得import -->
        <!-- <import type="com.example.lifecycle.Idol"/>-->
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="356dp" />

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:src="@drawable/ic_baseline_ac_unit_24"
            app:layout_constraintBottom_toTopOf="@+id/guideline2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="126dp"
            android:layout_height="50dp"
            android:layout_marginTop="68dp"
            android:text="@{idol.name}"
            android:textSize="24sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.529"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            app:layout_constraintVertical_bias="0.0" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="106dp"
            android:layout_height="44dp"
            android:text="@{idol.myGetStar()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.504"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline2"
            app:layout_constraintVertical_bias="0.401" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{PushButton.sayHello}"
            android:text="SayHello"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.511"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline2"
            app:layout_constraintVertical_bias="0.767" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="试验不用findviewbyid功能"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.497"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline2"
            app:layout_constraintVertical_bias="0.59" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

MainActivity.class

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        Idol idol = new Idol("人图像","五星");
        //把这个对象传给布局文件
        activityMainBinding.setIdol(idol);
        activityMainBinding.setPushButton(new PushButtonSayHello(this));

        //不用写findViewById即可调用组件
        activityMainBinding.button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "不用写findViewById即可调用组件", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

 

第二个专题:二级页面的绑定与数据传递

 

 

 

页面的搭建:

 

 

Idol.class
public class Idol {

    public String name;
    public String star;

    public Idol(String name, String star) {
        this.name = name;
        this.star = star;
    }

    public String myGetStar() {
        return star;
    }
}

MainActivity.class


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        Idol idol = new Idol("人图像","五星");
        //把这个对象传给布局文件
        activityMainBinding.setIdol(idol);

    }
}

activity_main.xml


<?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="idol"
            type="com.example.lifecycle.Idol" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="356dp" />

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:src="@drawable/ic_baseline_ac_unit_24"
            app:layout_constraintBottom_toTopOf="@+id/guideline2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <!-- 使用这个就可以把对象传给二级页面   app:idol="@{idol}"-->
        <include
            layout="@layout/sub"
            android:layout_width="376dp"
            android:layout_height="265dp"
            app:idol="@{idol}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.542"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            app:layout_constraintVertical_bias="0.372" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

sub.xml

<?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="idol"
            type="com.example.lifecycle.Idol" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="177dp"
            android:layout_height="103dp"
            android:gravity="center"
            android:text="@{idol.name}"
            android:textSize="34sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.171" />

        <!--    android:text="@{idol.star}" 这样就传进来了,不过要转为DataBinding布局-->
        <TextView
            android:id="@+id/textView2"
            android:layout_width="209dp"
            android:layout_height="108dp"
            android:gravity="center"
            android:text="@{idol.star}"
            android:textSize="34sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.47" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

 

 

posted @ 2021-11-27 20:13  涂妖教  阅读(208)  评论(0)    收藏  举报