1.导包 ViewModel 用于观察数据
// 使用androidx版本库
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'
2.在build.gradle 添加 在android 代码块中添加 复制后点更新(Sync Now)
android{
...
// 步骤1.开启data binding
dataBinding {
enabled = true
}
...
}
3.写个类继承 ViewModel
package com.example.mydatabinding;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> data;
public MutableLiveData<Integer> getData() {
if(data == null){
data = new MutableLiveData<>();
data.setValue(0);
}
return data;
}
public void add(){
data.setValue(data.getValue() + 1);
}
}
4.修改xml activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 步骤2. 点击小灯泡生成新的xml -->
<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="dataIs"
type="com.example.mydatabinding.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--
设置数据
android:text="@{String.valueOf(dataIs.data)}"
-->
<TextView
android:textSize="24sp"
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(dataIs.data)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.526"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.191" />
<!--
点击事件 调用类中的方法
android:onClick="@{() -> dataIs.add()}"
-->
<Button
android:onClick="@{() -> dataIs.add()}"
android:id="@+id/btn_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_txt"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.528"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.33" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
5.简化后的代码 MainActivity.java
package com.example.mydatabinding;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.mydatabinding.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private MyViewModel myViewModel;
// private TextView textView;
// private Button button;
//3.xml重新生成后就有了 ActivityMainBinding 对象,不是固定的 ,根据layout中起的名字 会生成不同的Binding对象
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//就可以不用了
// setContentView(R.layout.activity_main);
//获取到xml主布局中的所有的view
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
//
// button = findViewById(R.id.btn_test);
// textView =findViewById(R.id.tv_content);
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
// xml 中的 dataIs
binding.setDataIs(myViewModel);
binding.setLifecycleOwner(this); //观察
//观察 也可消掉
/* myViewModel.getData().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
//内容发生改变
// textView.setText(String.valueOf(integer));
binding.tvContent.setText(String.valueOf(integer));
}
});
*/
//事件 也可以消掉
/*binding.btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用 方法
myViewModel.add();
}
});*/
}
}