您的位置:首页 > 移动开发 > Android开发

DataBinding基本功能使用笔记

2017-06-26 14:20 363 查看
DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个关键工具。

基本用法

1 Gradle启用DataBinding

Android{
….
databinding{
enabeled true
}
}


2 创建viewmodel包,包下创建一个UserViewModel,这里实现了双向绑定,需要注意set方法加notifyPropertyChanged(),get方法加@Bindable注解;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

import com.android.databinding.library.baseAdapters.BR;

/**
* Created by chentanrong on 2017/3/22.
*/

public class UserViewModel extends BaseObservable{

private boolean gender;//男--true  女--false
private String username;
private String password;

public UserViewModel(boolean gender, String username, String password) {
this.gender = gender;
this.username = username;
this.password = password;
}

@Bindable
public boolean isGender() {
return gender;
}

public void setGender(boolean gender) {
this.gender = gender;
notifyPropertyChanged(BR.gender);
}
@Bindable
public String getUs
4000
ername() {
return username;
}

public void setUsername(String username) {
this.username = username;
notifyPropertyChanged(BR.password);
}
@Bindable
public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
notifyPropertyChanged(BR.password);
}

@Override
public String toString() {
return "UserViewModel{" +
"gender=" + gender +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}


2 在需要绑定的xml中,引用这个ViewMode,其如在activity_main.xml中绑定:

<?xml version="1.0" encoding="utf-8"?>
<layout>

<data>

<variable
name="userViewModel"
type="com.yulintu.databind.viewmodel.UserViewModel" />
</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.yulintu.databind.MainActivity">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={userViewModel.username}" />//加“=”才能双向绑定

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={userViewModel.password}" />

<RadioGroup
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/radioButtonM"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={userViewModel.gender}"
android:text="男" />

<RadioButton
android:id="@+id/radioButtonF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={!userViewModel.gender}"
android:text="女" />
</RadioGroup>
<Button
android:id="@+id/buttonRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册" />

</LinearLayout>
</layout>


3 在mainActitiy中,DataBindingh会根据activity_main.xml的名字自动生成一个ActivityMainBinding的类,此时需要将setContentView( R.layout.activity_main)换成ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

public class MainActivity extends AppCompatActivity {

private ActivityMainBinding binding;
private UserViewModel userViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
userViewModel =new UserViewModel(true,"chentanrong","123454");
//当viewModel中的值发生改变时的回调
Observable.OnPropertyChangedCallback onPropertyChangedCallback=new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable observable, int i) {
if(i==BR.gender&&observable instanceof UserViewModel ){
Toast.makeText(getApplicationContext(),((UserViewModel) observable).isGender()?"男":"女", Toast.LENGTH_LONG).show();
}
if(i==BR.username&&observable instanceof UserViewModel ){
Toast.makeText(getApplicationContext(),((UserViewModel) observable).getUsername(), Toast.LENGTH_LONG).show();
}
if(i==BR.password&&observable instanceof UserViewModel ){
Toast.makeText(getApplicationContext(),((UserViewModel) observable).getPassword(), Toast.LENGTH_LONG).show();
}
}
};
userViewModel.addOnPropertyChangedCallback(onPropertyChangedCallback);
//界面点击事件的回调
binding.buttonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), userViewModel.toString(), Toast.LENGTH_LONG).show();
}
});
binding.setUserViewModel(userViewModel);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvvm android