案例效果
依赖导入
dataBinding{
enabled = true
}
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
xml代码
记住使用layout包裹,命名空间也要提至layout里
<?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"
android:id="@+id/layout"
tools:context=".MainActivity">
<data>
<variable
name="data"
type="com.mt.baskballdemo.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="147dp" />
<TextView
android:gravity="center"
android:textColor="#ff00"
android:textSize="30dp"
android:id="@+id/textView"
android:layout_width="395dp"
android:layout_height="145dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:text="篮球比赛计分案例"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<Button
android:id="@+id/button"
android:layout_width="117dp"
android:layout_height="78dp"
android:background="#009688"
android:textColor="#F7F2F2"
android:textSize="25sp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:text="+1"
android:onClick="@{()->data.addANumber(1)}"
app:layout_constraintBottom_toTopOf="@+id/button2"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintHorizontal_bias="0.504"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline3"
app:layout_constraintVertical_bias="0.259" />
<Button
android:id="@+id/button2"
android:layout_width="117dp"
android:layout_height="78dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="12dp"
android:background="#009688"
android:onClick="@{()->data.addANumber(2)}"
android:text="+2"
android:textColor="#F7F2F2"
android:textSize="25sp"
app:layout_constraintBottom_toTopOf="@+id/button3"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintHorizontal_bias="0.527"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button3"
android:layout_width="117dp"
android:layout_height="78dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="164dp"
android:background="#009688"
android:text="+3"
android:onClick="@{()->data.addANumber(3)}"
android:textColor="#F7F2F2"
android:textSize="25sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintHorizontal_bias="0.527"
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="205dp" />
<Button
android:id="@+id/button4"
android:layout_width="117dp"
android:layout_height="78dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:background="#3F51B5"
android:text="+1"
android:onClick="@{()->data.addBNumber(1)}"
android:textColor="#F7F2F2"
android:textSize="25sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.506"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toTopOf="@+id/guideline3" />
<Button
android:id="@+id/button5"
android:layout_width="117dp"
android:layout_height="78dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="12dp"
android:background="#3F51B5"
android:onClick="@{()->data.addBNumber(2)}"
android:text="+2"
android:textColor="#F7F2F2"
android:textSize="25sp"
app:layout_constraintBottom_toTopOf="@+id/button6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.506"
app:layout_constraintStart_toStartOf="@+id/guideline2" />
<Button
android:id="@+id/button6"
android:layout_width="117dp"
android:layout_height="78dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="164dp"
android:background="#3F51B5"
android:text="+3"
android:onClick="@{()->data.addBNumber(3)}"
android:textColor="#F7F2F2"
android:textSize="25sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.506"
app:layout_constraintStart_toStartOf="@+id/guideline2" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="256dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="150dp"
android:layout_height="50dp"
android:textSize="30dp"
android:textColor="#009688"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:text="@{String.valueOf(data.getaNumber())}"
app:layout_constraintBottom_toTopOf="@+id/guideline3"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline" />
<TextView
android:id="@+id/textView3"
android:layout_width="150dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:text="@{String.valueOf(data.getbNumber())}"
android:textColor="#3F51B5"
android:textSize="30dp"
app:layout_constraintBottom_toTopOf="@+id/guideline3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toTopOf="@+id/guideline"
app:layout_constraintVertical_bias="0.666" />
<ImageView
android:id="@+id/imageView"
android:layout_width="105dp"
android:layout_height="94dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:onClick="@{()->data.undo()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintHorizontal_bias="0.571"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3"
app:layout_constraintVertical_bias="0.574"
app:srcCompat="@drawable/back" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="93dp"
android:layout_height="85dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:onClick="@{()->data.reset()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toBottomOf="@+id/button6"
app:srcCompat="@drawable/reset" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
ViewModel代码
这里有两个数据,一个是A队的得分,一个B队的得分
package com.mt.baskballdemo;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> NumberA;
private MutableLiveData<Integer> NumberB;
private int aBack,bBack;
public MutableLiveData<Integer> getaNumber() {
if(NumberA == null){
//如果为空,就为Number赋值0
NumberA = new MutableLiveData<>();
NumberA.setValue(0);
}
return NumberA;
}
public MutableLiveData<Integer> getbNumber() {
if(NumberB == null){
//如果为空,就为Number赋值0
NumberB = new MutableLiveData<>();
NumberB.setValue(0);
}
return NumberB;
}
//加分
public void addANumber(int n){
aBack = NumberA.getValue();
bBack = NumberB.getValue();
NumberA.setValue(NumberA.getValue()+n);
}
public void addBNumber(int n){
aBack = NumberA.getValue();
bBack = NumberB.getValue();
NumberB.setValue(NumberB.getValue()+n);
}
//清零
public void reset(){
aBack = NumberA.getValue();
bBack = NumberB.getValue();
NumberA.setValue(0);
NumberB.setValue(0);
}
//撤销
public void undo(){
NumberA.setValue(aBack);
NumberB.setValue(bBack);
}
}
MainActivity代码
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//通过DataBindingUtil的setContentView方法或许布局
binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
//获取MyViewModel对象
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
//为xml绑定数据
binding.setData(myViewModel);
//设置观察,便于监听数据变化
binding.setLifecycleOwner(this);
}
}