DataBinding-是时候放弃butterknife了

来源:互联网 发布:淘宝正品运动鞋店推荐 编辑:程序博客网 时间:2024/05/22 08:05

butternife简介

通常我们控件实例化是通过findViewById完成的,控件的事件监听是通过setonclicktListener完成,而butterknife可以让我们从大量的findViewById和setonclicktListener解放出来

解放findViewById

    @BindView(R.id.tv_title)    TextView titleTv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main_activity);        ButterKnife.bind(this);        //这样之后就可以直接使用变量了        titleTv.setText("test");    }

解放setonclicktListener

  @OnClick({R.id.iv_search})    public void onClick(View v) {        switch (v.getId()) {            case R.id.iv_search:                break;        }    }

详细请参考http://jakewharton.github.io/butterknife/

主角登场DataBinding

databinding不但能实现butterknife上面的两个优点,而且还有更多,databinding是一个support库,可以兼容到android2.1

引入

在app module的build.gradle里面加入databinding

android {    ....    dataBinding {        enabled = true    }}

注意:需要android studio1.3版本及以上

使用

有三个步骤

  • 创建与ui关联的javabean类
  • 在布局文件引入layout data标签 引入对应的javabean类
  • javabean对象与ui进行绑定

1.javabean类

假设有一个User的JavaBean

private static class User extends BaseObservable {   private String firstName;   private String lastName;   @Bindable   public String getFirstName() {       return this.firstName;   }   @Bindable   public String getLastName() {       return this.lastName;   }   public void setFirstName(String firstName) {       this.firstName = firstName;       notifyPropertyChanged(BR.firstName);   }   public void setLastName(String lastName) {       this.lastName = lastName;       notifyPropertyChanged(BR.lastName);   }}

需要继承BaseObservable,这样当User对象数据变化就会自动更新UI,调用notifyPropertyChanged通知更新ui
@Bindable会自动生成BR类

2.配置布局文件

在布局外层加layout标签和data标签

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">   <data>       <variable name="user" type="com.example.User"/>       <variable name="handlers" type="com.example.MyHandlers"/>   </data>   <LinearLayout       android:orientation="vertical"       android:layout_width="match_parent"       android:layout_height="match_parent">       <TextView android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@{user.firstName}"/>       <TextView android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@{user.lastName}"/>       <TextView android:layout_width="wrap_content"           android:id="@+id/tv_title"           android:layout_height="wrap_content"           android:text="@{"hello"+ user.firstName}"           android:onClick="@{handlers::onClickFriend}"/>   </LinearLayout></layout>

配置了id的view,会自动生成一个实例

public final TextView tvTitle;

假设ActivityMainBinding对象a。通过a.tvTitle来访问带id控件 ,实现了butterknife解放findviewbyid的优点
onclick属性配置了@{handlers::onClickFriend},实现了butterknife解放setonclicklistener的优点

public class MyHandlers {    public void onClickFriend(View view) { ... }}

注意:布局文件中 databinding对中文的支持不好,比如

android:text='@{data.count+"阅读"}'
android:text='@{data.count+"time"}'

中文的情况会报错,而英文不会。这种情况可以配置到string.xml中,

<string name="read_count">%s阅读</string>

然后这样访问

   android:text='@{@string/read_count(data.count)}'

3.数据与ui绑定

默认情况下,一个Binding类会基于layout文件的名称而产生(首字母大写并且去掉下划线末尾加上Binding)。上述的layout文件是activity_main.xml,因此生成的类名是ActivityMainBinding。

@Overrideprotected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);   User user = new User("Test", "User");   binding.setUser(user);}

通常更新ui都是通过调用控件方法来更新ui,比如类似

tv_title.setText(User.firstName);tv_title2.setText(User.firstName);tv_title3.setText(User.firstName);

当ui越多的时候,代码就越多,而databinding只需一句话。是不是很方便。

详细用法参考

http://blog.csdn.net/qibin0506/article/details/47393725

0 0
原创粉丝点击