dataBinding实现和原理分析

dataBinding实现和原理分析dataBinding是Google退出的数据绑定⽀持库,使⽤该库可以直接实现数据Model和页⾯的双向绑定。实现⽅法
1、在app下的adle的android{…}中添加:
dataBinding {
enabled = true
}
2、新建bean对象
public class UserInfo{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3、在layout的xml⽂件中添加数据源:
格式是:
如:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="schemas.android/apk/res/android">
<data>
<variable
name="user"
type="ample.mvvp2demo.bean.UserInfo" />
</data>
<LinearLayout
xmlns:tools="schemas.android/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.username}"/>
抛丸机除尘<EditText
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.password}"/>
</LinearLayout>
</layout>
其中的data标签⽤来标识model,type不是类型,⽽是bean类的路径。将EditText的text属性设置成@{},就可以获取⾃定义bean 对象的属性。
4、rebuild⼀下,apt⼯具会⾃动在build⽂件夹下⽣成多个⽂件
5、在l中通过DataBindingUtil⼯具类设置布局⽂件,并来获取binding对象,bingding类在刚刚rebuild的时候已⾃动⽣成,它的类名是:布局名+Binding,如布局⽂件名是:l,那么⽣成的类名是ActivityMainBinding.
使⽤DataBindingUtil.setContentView⽅法替换原本的setContentView⽅法,并获取它返回的对象:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
通过类对象的set⽅法,就可以设置⾃定义的bean对象了。
binding.setUser(info);
完整的MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
UserInfo info = new UserInfo();
info.setUsername("username");
info.setPassword("password");
binding.setUser(info);
}
}
此时数据已经能显⽰到控件上了:
试试看Model层的数据改变时控件的数据是否会改变,设置⼀个定时器:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
info.setUsername("username2");
info.setPassword("password2");
}
}, 5000);
5秒过后,什么也没有发⽣!
这是因为此时的数据还没有设置监听,需要对Bean类的属性做⼀些额外的设置:
import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;
import androidx.databinding.library.baseAdapters.BR;
public class UserInfo extends BaseObservable {
private String username;
private String password;
@Bindable
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
notifyPropertyChanged(BR.username);
}
@Bindable
public String getPassword() {
return password;
解剖小白鼠}
public void setPassword(String password) {汽车报警系统
this.password = password;
notifyPropertyChanged(BR.password);
}
}
继承BaseObservable,给set⽅法设置notifyPropertyChanged(BR.password);给get⽅法设置注解,然后运⾏。
缓冲块这时发现model层的值变了,5秒后控件的数据值改变了,同时控件收到了这个变化,于是控件的值也改变了。这就是单向绑定:Model层→View层。
还有⼀种⽅式,直接将bean改成这样:
import androidx.databinding.BaseObservable;
import androidx.databinding.ObservableField;
public class UserInfo extends BaseObservable {
public ObservableField<String> username = new ObservableField<>();
public ObservableField<String> password = new ObservableField<>();
}
这样的效果与上⼀种相同,只是属性值的获取稍微发⽣了变化:
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final UserInfo info = new UserInfo();
info.username.set("username");
info.password.set("password");
binding.setUser(info);
new Handler().postDelayed(new Runnable() {
wntc@Override
public void run() {
info.username.set("username2");
info.password.set("password2");
}
}, 5000);
}
}
5秒过后View层的控件值变了,效果与之前的⼀样!但是这样,View层控件值改变,Model层的数据能监听到吗?试试这样:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
usernameEt.setText("123456789");
passwordEt.setText("abcdefg");
Log.d(TAG, "run: " + "username:"+Username()+",password:"+Password());
}
}, 5000);
设置⼀个定时器,5秒后控件的值发⽣变化,然后打印Model层的数据值:
可见Model层的数据值并没有随着控件的值发⽣改变。
这时其实只要在之前View层的控件值中,这样修改:
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.username}"/>
<EditText深海导航
android:id="@+id/et_pwd"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.password}"/>
改为:

本文发布于:2024-09-22 06:45:32,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/252483.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   控件   改变   设置   对象   绑定   获取   没有
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议