Android Jetpack架构组件之DataBinding

DataBinding

https://developer.android.google.cn/topic/libraries/data-binding

DataBinding的意义

让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低

Android Jetpack架构组件之DataBinding_第1张图片

//build配置
dataBinding = true

//布局生成databinding layout
//导入方法:布局文件使用代码
//
<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

Android Jetpack架构组件之DataBinding_第2张图片

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. thisnew ViewModelProvider.Android
activityMainBinding.setViewModel (viewModel) ;
//感知生命周期
activityMainBinding.setLifecycleowner(this);

DataBinding的优势

不再需要findViewByld,项目更加简洁,可读性更高。
布局文件可以包含简单的业务逻辑。

Android Jetpack架构组件之DataBinding_第3张图片

你可能感兴趣的:(Jetpack,android,jetpack,databinding)