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
- DataBinding-是时候放弃butterknife了
- 是时候来一发DataBinding了
- 是时候该放弃Surface了
- 是时候放弃个人独立博客了
- Web2.0: 是时候放弃弹出窗口了!
- 是时候放弃putty了,推荐个putty的替代品:Xshell,Bitvise SSH Client
- 是时候放弃putty了,推荐个putty的替代品:Xshell
- 程序包com.**.****.databinding不存在 ButterKnife Databinding
- 是时候这样了
- 是时候了!
- 是时候了
- 是时候了
- 是时候 UWP 了
- 是时候回归了
- 是时候整理了
- 是时候放弃MySQL的五大理由
- 是时候放弃MySQL的五大理由
- 是时候逛论坛了
- JS模板laytpl
- Webstorm切换快捷键风格(Webstorm快捷键与eclipse对比介绍)
- Android手机APN简介
- 使用onTouch判断滑动的方向
- Eclipse小技巧备忘
- DataBinding-是时候放弃butterknife了
- FFMPEG入门
- c#的异步调用
- LZMA SDK 9.20(与C相关)
- P、*P和&P三者的区别
- STM8L101+si4463低功耗和自动唤醒配置
- axure8.0使用教程
- JAVA实现HTTP服务器端
- Javascript 二维数组去重