Android Databinding小记

首先,看一下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()方法。

未完,后续补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值