Android Data Binding1(基础用法)
来源:互联网 发布:js if多条件并列判断 编辑:程序博客网 时间:2024/06/13 23:26
目前Data Binding只能在Android Studio 1.3以上版本且gradle版本也必须为1.3以上的,所以没升级的先升级装备吧。
需要使用Data Binding,只需要在项目的build.gradle文件下添加如下代码就可以了:
android { … dataBinding { enabled = true }}
使用Data Binding前要知道三点:
在需要绑定的xml布局中,我们需要用< layout> 作为最外层的布局
它是在xml布局文件中来完成数据的绑定的,所以在< layout> 布局中包含一个< data> 区域,在其中设置绑定到xml的数据Model
得到数据Model后,采用@{}表达式绑定数据到相应的控件上
示例Demo:
xml文件:
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="user" type="com.sunzxyong.databinding.User"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.userName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.userPassword}" /> </LinearLayout></layout>
将com.sunzxyong.databinding包下User类的一个对象绑定到了布局中,name=“user”就是给User定义一个名为user变量(名字可以随便取),之后通过@{user.userName}获得这个对象的用户名设置给TextView(其中user.userName获取数据的根源就是它是访问user对象中的getUserName()方法来获取数据)。
User类:
public class User { private String userName; private String userPassword; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public User(String userName, String userPassword) { this.userName = userName; this.userPassword = userPassword; }}
activity使用:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User("Sunzxyong", "12345678"); mBinding.setUser(user); }
我们在布局文件中的区域定义了一个User类型的user变量,我们在得到它的ViewModel对象后就可以通过调用setUser()方法来设置数据,那么ViewModel类是什么呢?在默认情况下系统会根据xml布局的名字来命名自动生成ViewModel类,比如刚刚我们的布局名为activity_main,那么它就会以 _ 下划线为分隔点命名结尾再加上Binding,所以这时我们的ViewModel是ActivityMainBinding,我们通过DataBindingUtil.setContentView()来获得对应xml文件的ViewModel,当然还有常用的DataBindingUtil.inflate(),如果绑定ListView或者RecyclerView的Item我们则通过:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
最后我们通过ViewModel把数据传递给View层显示。
自定义Binding Class Name,也就是自定义ViewModel类名,不是用系统默认根据xml文件名生成的
我们知道系统默认是根据xml布局文件名来生成Binding Class Name的,如:first_activity.xml,那么生成的Binding Class Name就是FirstActivityBinding,如果该app module的包名为com.sunzxyong.hello,那么生成的Bindind Class Name所处的依赖的包为com.sunzxyong.hello.databinding,在使用时候AS会自动导入该包,如:
import com.sunzxyong.hello.databinding.FirstActivityBinding
那么怎么自定义Binding Class 名呢?就是通过设置节点中class的名字就是我们自定义的Binding Class 名字,比如我们把Binding Class 名改为MyBinding,则:
<data class="MyBinding">...</data>
则该xml的Binding Class Name为MyBinding,代码中获取就变为这样了:
MyBinding mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
而它的默认依赖包名也是在module包下的databinding包中。
当然也可以自己定义Binding Class 的包名:
<data class="com.example.MyBinding"> ...</data>
注意自定义Binding Class Name时,一定要把包名带上,免得跨包数据使用异常
1.Data Binding类型详解
1.1 imports
就像Java代码一样,我们可以使用import导入我们在xml文件绑定数据时需要使用到的类,如我们需要使用到系统中的View类,可以这样:
<data> <import type="android.view.View"/></data>
然后使用它对控件进行相应属性值的绑定,如:
<TextView android:text="@{user.userName}" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isExist? View.VISIBLE : View.GONE}"/>
这样我们就可以使用View类的一些值,通过@{}来绑定这些值,用三元表达式进而决定控件的可见性。
1.2 class name conflicts类名冲突
如果我们自己创建了一个类名也为View,如:
public class View { private int width; private int height; /* * getter and setter ...... * */}
很明显这和系统中的View类名一样,那么在xml中怎么区别这两个不同的类呢?就是通过设置别名来区分。如:
<data> <import type="android.view.View"/> <import type="com.sunzxyong.databinding.View" alias="MyView"/></data>
我设置了我自己定义的View别名为MyView,那么对控件进行数据绑定时候就使用这个别名,如:
<TextView android:text="@{MyView.width}" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isExist ? View.VISIBLE : View.GONE}"/>
1.3 List集合的使用
<data> <import type="com.sunzxyong.databinding.User"/> <import type="java.util.List"/> <variable name="userList" type="List<User>"/></data>
这里我们定义了一个List 这样的一个集合,名为userList,其中特别注意一点,在@{}表达式中不支持左括号,所以我们需要用转义字符代替左括号,然后在控件中获取集合的数据是通过userList[0]来获取的,这点和数组一样,而我们定义的是List集合,所以最终获取第一位用户的用户名是这样的:userList[0].userName,然后绑定数据在控件上。
<TextView android:text="@{userList[0].userName}" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
这里打印出来的将是集合中第一个元素的userName。
如果index索引需要动态改变,那么就这样:
<data> <import type="java.util.List"/> <variable name="list" type="List<String>"/> <variable name="index" type="int"/></data>…android:text="@{list[index]}"
1.4 Variables变量
【注意一点】java.lang.*包下的类是不需要导入的,因为这和java一样lang包下的类都是自动导入进去了,如:
<data> <variable name="number" type="String"/></data>
绑定数据:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{number}" />
然后通过代码设置mBinding.setNumber(“888888”);那么屏幕上显示将是888888。
因为自动导入了lang包,可以直接使用String、int、boolean等类,这些变量在没有传递值的情况下和java一样,都有默认值,引用类的为null,int为0,boolean为false等。
2 设置View的id activity中获取控件
虽然说Data Binding这种分层模式使得我们对数据的传递简单明了,一般情况下我们可以不设置View的id,不使用findViewById即可对View进行数据上一系列的操作,不过有时候根据情况我们需要对某些View设置id,但是还是可以不findViewById即可得到该控件的对象,因为设置id后ViewDataBinding类会自动生成对应的控件对象,如:
<TextView android:id="@+id/tvmsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.Msg}" />
在Activity中获取控件,然后就可以对控件进行操作了
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); tv_msg=mainBinding.tvmsg; tv_msg.setText("哈哈哈");
- Android Data Binding1(基础用法)
- Android Data Binding基础用法
- [Android基础]Intent用法的二三事(下)——Data、Type、Extra、Flag的属性详解
- Android Data Binding 高级用法
- android基础之onSaveInstanceState用法(二)
- android RecylearView笔记(一)基础用法
- Android.mk用法基础
- android 数据库基础用法
- Android基础-TextView用法
- Android基础-Button用法
- Android基础-AutoCompleteTextView用法
- Android基础-EditText用法
- Android基础-MultiAutoCompleteTextView用法
- Android基础-Notification用法
- Android基础-RadioButton用法
- Android基础-CheckBox用法
- Android基础-DatePickerAndTimePicker用法
- Android基础-Intent用法
- zeroc ice demo project 编译不通过咋办?
- c++练习
- Java中的排序
- Math.round()
- 【leetcode】String to Integer(atoi)
- Android Data Binding1(基础用法)
- ActionBarDisplayOptions展示选项的菜单
- 【算法概论】2.分治算法
- 关键字 - static
- 字符串匹配算法KMP详细解释——深入理解
- recv recvfrom
- SVN服务器的本地搭建和使用
- 【算法概论】3.图的分解
- ubuntu 自动编译