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方法里,就能操作数据了。
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()方法。
未完,后续补充。
- Android Databinding小记
- Android DataBinding
- Android DataBinding
- Android DataBinding
- Android DataBinding
- Android databinding
- android DataBinding
- android databinding实践之:databinding 注解
- android MVVM DataBinding
- Android里的DataBinding
- Android DataBinding介绍
- Android DataBinding原理解析
- Android DataBinding 配置问题
- 初学 android databinding
- Android DataBinding 双向绑定
- Android官方框架DataBinding
- Android DataBinding完全解析
- Android databinding笔记
- 调整数组使奇数全部都位于偶数前面。 杨氏矩阵
- 浅析JavaScript中this储存
- Adapter的作用及用法(四种适配器详解)
- 数据库字段char、varchar和nvarchar的区别
- C++ Concurrency in Action.pdf 英文原版 免费下载
- Android Databinding小记
- arm汇编总结---让汇编不再神秘
- 搭建SSM常用配置web.xm
- android jni打开文件数 too many open files 解决方法
- Practical Concurrent Haskell.pdf 英文原版 免费下载
- js DOM属性
- Splay 总结及模板
- Android 中新建并配置一个Builder
- linux 下java 安装及环境配置 重点在后边