- LifeCycle,ViewModel(LiveData),DataBinding
- 前言
- 一、LifeCycle
- 二、ViewModel(LiveData)先引入依赖
- 1.创建一个自定义类来继承ViewModel
- 2.修改活动中的代码
- 3.给一个简单的xml文件,两个button来 *** 作数,一个TextView来显示数
- 4.最后修改活动中的整体代码如下
- 三,DataBinding
- 1.先在manifest中去声明
- 2.接着我们转到布局文件xml
- 3.反向绑定
- 总结
前言
记录安卓学习的每一天
一、LifeCycle
这个我就不讲了,也讲不清楚哈哈哈
二、ViewModel(LiveData)先引入依赖这是一个好东西,具体好在哪里呢,比如说,我们在手机翻转屏幕的时候呢,如果不ongoingonCreate里的那个Bundle savedInstanceState来做一个缓存,就会导致数据丢失,这是一个很麻烦的事情,然而这个ViewModel(LiveData)就强大了,他独立出来,用来管理界面上零时的一些缓存数据,这种解耦不仅方便,而且提供程序的可 *** 作性,后期的维护什么的都比较方便。
我一般习惯用搜索的方式添加依赖,这样一般搜到的都是最新的
代码如下(示例):
//这里演示用法,内部就只增加一个int类型的number。
public class myViewModel extends ViewModel {
//这个ViewModel类是用来管理的数据的
public int number = 0;
}
2.修改活动中的代码
注意原有的绑定ViewModel方式被废弃了,这里采用最新的
代码如下(示例):
viewModel = new ViewModelProvider(this).get(myViewModel.class);
3.给一个简单的xml文件,两个button来 *** 作数,一个TextView来显示数
代码我就不贴了
public class MainActivity extends AppCompatActivity {
private myViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewModel = new ViewModelProvider(this).get(myViewModel.class);
TextView textView = findViewById(R.id.textView);
textView.setText(String.valueOf(viewModel.number));//暂时保存数据
Button add = findViewById(R.id.add);
Button del = findViewById(R.id.del);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.number++;
textView.setText(String.valueOf(viewModel.number));
}
});
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.number --;
textView.setText(String.valueOf(viewModel.number));
}
});
}
}
这样就完成了,ViewModel的基本使用就是这个样子啦,是不是很简单
三,DataBinding要是说ViewModel是好东西,那这个DataBinding也一定是好东西,而且非常好,真的,他是干嘛的呢,我们再每次一使用控件,总是需要绑定对吧,“方的为由拜爱地”有时候要写个十几几十个,对吧吗,直接吐血,那有了这个DataBinding之后就再也不用写“方的为由拜爱地”了哈哈哈哈哈
在此之前,我们修改一下上面的代码
public class myViewModel extends ViewModel {
//定义一个活着的数据,并指定类型
private MutableLiveData number;//MutableLiveData的父类是LiveData,这样就可以添加观察了
//为这个活着的数据添加一个getNumber方法,以便在活动中得到这个数据并且为其添加观察
public MutableLiveData getNumber(){
if(number==null){
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
}
//这里我们继续将对数据的 *** 作方法独立出来,进一步解耦
public void add(){
number.setValue(number.getValue()+1);
}
public void del(){
number.setValue(number.getValue()-1);
}
}
public class MainActivity extends AppCompatActivity {
private myViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
Button add = findViewById(R.id.add);
Button del = findViewById(R.id.del);
viewModel = new ViewModelProvider(this).get(myViewModel.class);
//先得到数据,再添加一个观察
viewModel.getNumber().observe(this, new Observer() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.add();
}
});
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.del();
}
});
}
}
相应的都给出了注释,你会发现代码再一次清晰明了,简洁了,我们不用总对TextView进行 *** 作,只需要添加观察就行了,对吧。
好的,下面就开始重点了,DataBinding了
defaultConfig {
applicationId "com.example.viewmoder"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//下面这两行是增加的
dataBinding{
enabled true
}
}
2.接着我们转到布局文件xml
点击这个图片的小灯泡,选择convert to data binding layout,会出现下面这样
这时候我们回到活动中,活动中或多了一个类型,ActivityMainBinding,接着通过这句话
ActivityMainBinding mainBinding;
mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
代替setContentView(R.layout.activity_main);这样我们就不再需要写“方的为由拜爱地”了,可以直接通过
对象mainBinding来调用
示例代码
public class MainActivity extends AppCompatActivity {
ActivityMainBinding mainBinding;
private myViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
viewModel = new ViewModelProvider(this).get(myViewModel.class);
//添加一个观察
viewModel.getNumber().observe(this, new Observer() {
@Override
public void onChanged(Integer integer) {
mainBinding.textView.setText(String.valueOf(integer));
}
});
mainBinding.add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.add();
}
});
mainBinding.del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.del();
}
});
}
}
是不是很爽,对吧,如果你觉得这就没了,真就大错特错了,他还可以反向绑定,
3.反向绑定回到上面的图,点击小灯泡之后自动生成了这个标签,这个就是用来声明这个额xml文件要和那个java代码绑定的意思,看 *** 作吧
======================改动处
主活动
public class MainActivity extends AppCompatActivity {
ActivityMainBinding mainBinding;
MyViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局进活动
mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
//实例化viewModel来缓存数据
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
//设置反向绑定的viewModel类
mainBinding.setData(viewModel);
//将反向绑定设置为自我监听
mainBinding.setLifecycleOwner(this);
}
}
当主活动减少到这个地步,我人都傻了,说实话目前的我觉得反向绑定并不好用,因为代码逻辑都不清楚了,后期改不能跑到xml文件中去修改代码吧,咱也不敢说呀是不是,先记录一手吧。
总结记录一下吧,MVVM模式,说实话有点过于强大了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)