DataBinding
https://developer.android.google.cn/topic/libraries/data-binding
DataBinding的意义
让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低
//build配置
dataBinding = true
//布局生成databinding layout
//导入方法:布局文件使用代码
//<import type="com.dongnaoedu.databinding.star0tils"/>
<Layout
<data>
<variable
name="idol"
type="com.dongnaoedu.databinding.Ido1"/>
</data>
//ActivityMainBinding由来
ActivityMainBinding binding = DataBingingUtil.setcontentView(this,R.layout.activity_main);
Idol idol = new Idol("name",5);
binding.setIdol(idol);
//xml获取属性
android:text="@{idol.name}"
//按钮点击事件绑定
//定义点击事件监听类
EventHandleListener{
private onclick(){
}
}
//添加绑定
binding。setEventHandleListener(new EventHandleListener(this));
//布局文件添加事件类
<data>
<variable
name="eventHandle"
type="com.dongnaoedu.databinding.EventHandleListener"/>
</data>
<Button
click="@{eventHandle.onclick}"
二级页面的绑定:<include>标签引用二级页面
//使用下述方法传递
app:idol = "@{idol}"
自定义BindingAdapter
加载网络图片
方法重载,加载本地图片
多参数重载
自定义binding
//1.自定义
//public class ImageviewBindingAdapter
//加载网络图片 image注解
@BindingAdapter ( "image")
public. .static..void..set Image.(ImageView...imageView..tring..url){
if( !TextUtils.isEmpty (ur1)){
Picasso-get(0 Picasso
.load (url) RequestCreator
.placeholder (R.drawable.ic_launcher_background).into (imageview) ;
}else{
imageView.setBackgroundColor (color . GRAY) ;
}
)
//2.layout绑定
<data>
<variable
name="networkImage"
type="String"/>
</data>
<Imageview
android: id="@+id/imageView""
app:image="@ {networkImage} //image为注解
android: layout_width="300dip"
//3.绑定
ActivityMainBinding binding = DataBingingUtil.setcontentView(this,R.layout.activity_main);DataBindingUtil.setContentactivityMainBinding.setNetworkImage ("https://gimg2.baidu.com/image_s");
//可选择
@BindingAdapter (value = { "image","defaultImageResource" }, requireAll = false)
<Imageview
android: id="@+id/imageView""
app:image="@ {networkImage} //image为注解
app:default="@ {localImage}
android: layout_width="300dip"
双向绑定
BaseObservable与ObservableField
BaseObservable方式
//User对象
public class User {
public string userName;
public User (String userName) {
this.userName = userName;
}
)
//UserViewModel对象
public class UserViewModel extends Base0bservable{
private User user;
public UserViewModel ( ) {
this.user = new User ( userName: "Jack" ) ;
}
//改变对象的值View变化
@Bindable
public string getUserName ( ) {
return user.userName ;
}
//当View变化时改变对象的值
public void setUserName ( String userName) {
if (userName != null && !userName. equals(user.userName) ) {
user. userName = userName;
Log.d( tag: "ning" , msg: "set username :"+userName);
notifyPropertyChanged(BR. userName) ;//通知对象的变化
}
}
<data>
<variable
name="userviewModel"
type="com.dongnaoedu.databinding4.UserviewModel" />
</ data>
//双向绑定@={}
<EditText
android: id-"e+id/editText"
android : layout_width="wrap_content"
android: layout height="wrap_content"
android : ems="10"
android: inputType="textPersonName"
android : text="@={userviewModel.userName)"
ContentactivityMainBinding.userviewModel (new UserViewModel());
ObservableField方式
public class UserViewModel {
private ObservableField<User> userobservableField;
public UserViewModel ( ) {
User user = new User ( userName: "Jack " ) ;
userObservableField = new ObservableField<> ();
userObservableField.set (user);
}
public String getUserName ( ) {
return userObservableField.get ().userName;
}
public void setUserName (String userName) {
Log.d( tag: "ning" , msg: "userObservableField: "+userName) ;
userObservableField.get ().userName = userName ;
}
}
RecycleView
//item xml布局:databinding layout
//适配器
public MyViewHolder onCreateViewHolder (NonNull ViewGroup parent,int viewType) {
ItemBinding itemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext (
R.layout.item,
parent,
attachToParent: false) ;
return new MyViewHolder (itemBinding) ;
}
@override
public void onBindViewHolder (@NonNull MyViewHolder holder,int position) {
Idol idol = idols.get (position) ;
holder.itemBinding.setIdol (idol) ;
}
//设置适配器
ActivityMainBinding binding = DatabinfingUtil.setContentView(this,R.layout.activity_main);
binding.recycleView.setLayoutManager(new LinearLayputManager(this))
binding.recycleView.setAdapetr(new RecycleAdapter())
篮球计分:ViewModel + LiveData + Databinding
public class MyViewModel extends viewModel {
private MutableLiveData<Integer> bTeamScore;
public MutableLiveData<Integer> getbTeamScore() {
if(bTeamScore -= nul1){
bTeamscore = new MutableLiveData<>();bTeanscore.setvalue (0) ;
}
return bTeamScore;
}
public void bTeamAdd (int i){
saveLastscore() ;
bTeamScore.setValue (bTeamScore.getValue ()+ i);
}
public void undo (){
aTeamscore.setValue (aLast);
bTeamScore.setValue(bLast) ;
}
}
//xml:添加点击事件
android: onClick="@{ ()->viewModel.undo ()}" I
//主activity绑定binding
ActivityMainBinding activityMainBinding m DataBindingUtil.setContentView( activity. this,R.layout.acticity_main);
//设置viewmodel data
MyViewWodel viewModel = new ViewModelProvider ( owner. this,new ViewModelProvider.Android
activityMainBinding.setViewModel (viewModel) ;
//感知生命周期
activityMainBinding.setLifecycleowner(this);
DataBinding的优势
不再需要findViewByld,项目更加简洁,可读性更高。
布局文件可以包含简单的业务逻辑。