首先,看一下Databinding是什么?观察其他使用Databinding技术的代码,会发现Java代码还是要写的,不同的是在xml(Android布局文件)中与正常的不太一样。它可以直接将监听事件放到xml中,而不需要findViewById。Databinding更像是增强xml的表达能力,拓展xml的功能。
1. 平台:Android Studio2.3,这个IDE版本已经集成了Databinding技术。在Android SDK->extras/android/m2repository/com/android/databinding 下面就是使用到的依赖库。然而最新的Android Studio已经将databinding集成进去了。我们只需要在build.gradle中配置一下就可以了
2. 配置如下:
dataBinding {
enabled = true
}
这样算是开启了,Android Studio对Databinding的支持。
Databinding的布局与普通布局有些区别,用一个登陆示例来说明。
3. 布局显示
布局最外层必须使用layout标签。layout标签里面又可以分为布局和ViewModel。
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="com.zzh.data.mvvm.model.LoginUser"/>
<variable
name="handle"
type="com.zzh.data.mvvm.click.HandleEvent"/>
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:ems="10"
android:hint="姓名"
android:inputType="text"
android:text="@={user.userName}"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:layout_editor_absoluteY="16dp"/>
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:hint="密码"
android:inputType="text"
android:text="@={user.password}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/userName"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:onClick="@{(v) -> handle.onClickOne(v, user)}"
android:text="点击一下"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/password"/>
</android.support.constraint.ConstraintLayout>
</layout>
3.1. 在xml中要使用ViewModel的话,就必须使用variable标签引入。variable标签有两个属性:name和type。name是自己起的名字,type是指向ViewModel的类(全限定类名)。name属性会自动生成setXXX(xxx表示自己起的那个名字)的方法。这样就可以在xml中使用了。
3.2. 在EditText中,android:text=”@={user.password}”表示数据双向绑定,如果@{}之间没有=,数据是不能从xml中传入到LoginUser的password属性中的。这就不能再LoginUser获取输入的文本。
3.3 Button标签增加了一个点击事件,这个点击事件就是HandleEvent中定义的一个onClickOne方法,方法有两个参数(View, LoginUser),这个事件是注册到android:onClick属性,但是这个属性需要一个view参数,这也是我们问什么onClickOne中会有一个参数是View,另一个参数是model–>user,这样在界面数据的数据,就传递到onClickOne方法里,就能操作数据了。
activity中代码如下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
LoginUser user = new LoginUser(“张三”, “123456zxc”);
binding.setUser(user);
HandleEvent event = new HandleEvent();
binding.setHandle(event);
}
}
上面再布局中使用到了LoginUser和HandleEvent两个类。同样在activity中,出现了一个新的类ActivityMainBinding,这个类是AndroidStudio自动生成的,这个类里面有一系列的setxxx和getxxx方法,这些方法是因为在xml中,使用virable标签引入的类,在Activity中要将使用到的“virable标签引入的类”实例化出来,并set到ActivityMainBinding中,否则会出现空指针异常。在布局中使用到了两个类。LoginUser和HandleEvent.
LoginUser.javapublic class LoginUser extends BaseObservable {
private String userName;
private String age;
private String password;public LoginUser() {
}
public LoginUser(String userName, String password) {
this.userName = userName;
this.password = password;
}
@Bindable
public String getUserName() {
return userName;
}public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
}public String getAge() {
return age;
}public void setAge(String age) {
this.age = age;
}@Bindable
public String getPassword() {
return password;
}public void setPassword(String password) {
this.password = password;
notifyPropertyChanged(BR.password);
}
}
HandleEvent.java
public class HandleEvent {
public static final String TAG = "------";
public void onClickOne(View v, LoginUser binding) {
if (binding == null) {
Log.d(TAG, "onClickOne: ViewDataBinding: " + binding);
return;
}
Log.d("------:", "" + binding.getUserName() + ", " + binding.getPassword()+", "+v);
}
}
LoginUser类继承了BaseObservable,这个是因为数据绑定是双向的,在登录界面中用户名和密码输入框,如果有文本改变(比如,我输入了用户名,或者删除了用户名),要体现在LoginUser这个类的实例中,也就是在activity里,set进入的loginUser实例,同样在代码中如果修改了LoginUser实例里面的值,这个值要体现在xml界面中。而它们之间的关联方式则是@Bindable注解和notifyPropertyChanged()方法。
未完,后续补充。