Android Databinding小记

来源:互联网 发布:木琴软件 编辑:程序博客网 时间:2024/06/07 08:46

首先,看一下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方法里,就能操作数据了。

  1. 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中,否则会出现空指针异常。

  2. 在布局中使用到了两个类。LoginUser和HandleEvent.

    LoginUser.java

    public 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()方法。

未完,后续补充。

原创粉丝点击