数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
简言之一句话:通过DataBingding隔离开controller与View的紧密联系
创建实例首先使用常用方法实现点击按钮文本记录自增1
本文为学习类文档,通过学习B站up主longway777的视频,如有侵权,请联系博主进行删除
创建ViewModel类
ViewModel类继承ViewModel
package com.example.databindingdemo;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData number;
public MutableLiveData getNumber() {
if (number == null){
number = new MutableLiveData();
number.setValue(0);
}
return number;
}
public void add(){
number.setValue(number.getValue()+1); //通过setValue实现数据更新
}
}
在MainActivity.java中声明变量
package com.example.databindingdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button button;
TextView textView;
MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
myViewModel.getNumber().observe(this, new Observer() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
}); //对LiveData的一个观察
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.add();
}
});
}
}
实现效果如下:
在controller中将MainActivity.java文件进行修改,读者可上下对比进行研究
package com.example.databindingdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.databindingdemo.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
//Button button;
//TextView textView;
MyViewModel myViewModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main); //xml中的标签即类似成为了binding的内部类
//textView = findViewById(R.id.textView_show);
//button = findViewById(R.id.button_click);
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
myViewModel.getNumber().observe(this, new Observer() {
@Override
public void onChanged(Integer integer) {
//textView.setText(String.valueOf(integer));
binding.textViewShow.setText(String.valueOf(integer));
}
}); //对LiveData的一个观察
// button.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// myViewModel.add();
// }
// });
binding.buttonClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.add();
}
});
}
}
界面运行时没问题的
4. 也可逆向绑定将点击事件绑定至Layout中
使用上述Layout中的
这组标签即可实现功能。
对controller进行再精简
package com.example.databindingdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.databindingdemo.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
//Button button;
//TextView textView;
MyViewModel myViewModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main); //xml中的标签即类似成为了binding的内部类
//textView = findViewById(R.id.textView_show);
//button = findViewById(R.id.button_click);
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
binding.setData(myViewModel); //在Layout中设置了一个variable,需要在此设value
binding.setLifecycleOwner(this);
// myViewModel.getNumber().observe(this, new Observer() {
// @Override
// public void onChanged(Integer integer) {
// //textView.setText(String.valueOf(integer));
// binding.textViewShow.setText(String.valueOf(integer));
// }
// }); //对LiveData的一个观察
// button.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// myViewModel.add();
// }
// });
// binding.buttonClick.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// myViewModel.add();
// }
// });
}
}
删除注释行可看到精简之后的最终controller代码极少
package com.example.databindingdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import com.example.databindingdemo.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
MyViewModel myViewModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main); //xml中的标签即类似成为了binding的内部类
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
binding.setData(myViewModel); //在Layout中设置了一个variable,需要在此设value
binding.setLifecycleOwner(this);
}
}
功能依旧正常,且翻转数据不会丢失