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>

浙公网安备 33010602011771号