EP13-DataBinding(1)

DataBinding

DataBinding是Android UI团队推出的适合于MVVM开发模式的扩展包。
简单介绍一下使用方法,翻译整理自Google的文档 Android Developers:

1. 配置

在Module的build.gradle中加入下面的代码就配置好了:

dataBinding {
    enabled true
}

2. layout

这时候XML已经不是单纯展示UI了。现在,我们要了原来的ViewGroup(各种线性、相对布局等等)外面,加入layout布局。和一个新的节点:data。



    
   
       
   
   
       
       
   

其一,data节点中的variable描述了可能在layout中使用的属性。


其二,用"@{}"函数来描述属性对应的表达式。这里textView的值设置成user的firstName属性:


3. Model

假设我们有一个叫作User的POJO

public class User {
   public final String firstName;
   public final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

这个Object的有着永远不会变的对象。在程序里只被读取一次,之后永远不变的data很常见。也可以使用Java Beans

public class User {
   private final String firstName;
   private final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
   public String getFirstName() {
       return this.firstName;
   }
   public String getLastName() {
       return this.lastName;
   }
}

从data binding的角度,这两个类是对等的,@{user.firstName}这个表达式会去前面的POJO面找firstName这个field,或者去Java Bean里面找getFirstName()方法。如果POJO里面存在firstName(),还是会去找firstName()方法。

4. Binding Data

默认地会根据layout文件生成一个Binding class,把这个layout文件转换成Pascal case,以"Binding"结尾(译注:这个文件要在build目录下去找)。上面的layout文件是main_activity.xml所以生成的类是MainActivityBinding。这个类包含了所有layout属性(比如user variable)和layout的View之间的bindings,并且知道如何通过binding表达式分配value。

最简单的创建binding的方法是在inflating的时候这样做:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   //MainActivityBinding在build目录生成
   MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Larry", "Liu");
   //自动生成了一个setUser方法,用来传递variable(例子里是user)
   binding.setUser(user);
}

好了,这样程序就可以运行了。

另外,还可以这样获取View:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

如果要绑定ListView或者RecyclerView的adapter里的item,还可以这样用:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

DEC 7

你可能感兴趣的:(EP13-DataBinding(1))