Data Binding学习(一)
来源:互联网 发布:网络暴力调查报告配图 编辑:程序博客网 时间:2024/06/01 07:41
1.为什么要使用Data Binding?
当我们没使用Data Binding时候布局是这样的
<LinearLayout …> <TextView android:id="@+id/name"/> <TextView android:id="@+id/lastName"/></LinearLayout>
这是一个你经常会看到的 Android UI。 假设你有一堆带 ID 的视频内容。你的设计师来了,说:“好吧,让我们尝试添加新的信
息到这个布局,”这样,当你添加任何布局,你需要跟随另外一个 ID。你需要回到你的 Java 代码,修改 UI。
private TextView mNameprotected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); mName = (TextView) findViewById(R.id.name);}public void updateUI(User user) { if (user == null) { mName.setText(null); } else { mName.setText(user.getName()); }}当有了一个新的 TextView,我们通过 findViewById 在代码中找到它,同时把它赋值给了变量,需要更新用户信息的时候,再通过它去给这个 TextView 设置上用户信息。
private TextView mNameprotected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); mName = (TextView) findViewById(R.id.name); mLastName = (TextView) findViewById(R.id.lastName);}public void updateUI(User user) { if (user == null) { mName.setText(null); mLastName.setText(null); } else { mName.setText(user.getName()); mLastName.setText(user.getLastName()); }}总的来说,仅仅为了增加一个 View 到你的 UI 当中,而我们做了好几个步骤的事情。虽然有时它不需要任何脑力,但是这似乎是比较愚蠢的样板代码,。
比较好的是,已经有一些漂亮的库可以简化我们的这些操作。比如你使用 ButterKnife 这个库,能够摆脱讨厌的 findViewById 而获得组件,它让代码更加简洁易读。通过它可以节省很多额外的代码。
private TextView mNameprotected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ButterKnife.bind(this);}public void updateUI(User user) { if (user == null) { mName.setText(null); mLastName.setText(null); } else { mName.setText(user.getName()); mLastName.setText(user.getLastName()); }}这样做确实也是不错的,但是我们想做的更好呢?有什么可以直接生成它。我有一个布局文件,我有它们的 IDs.” 所以,可以使用 Holdr,它可以替你可以处理布局文件,然后为他们创建 View 组件。通过 Holder,转换 View 的 ID 到组件变量。
private Holdr_ActivityMain holder;protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); holder = new Holdr_ActivityMain(findViewById(content));}public void updateUI(User user) { if (user == null) { holder.name.setText(null); holder.lastName.setText(null); } else { holder.name.setText(user.getName()); holder.lastName.setText(user.getLastName()); }}这种方式也不错,但其中仍然有很多是不必要的代码。而且这里还有一个可能我们没有想到的坑、我们无论如何无法减少代码量,它也是很简单的代码:我有一个 User 对象,我只是想把数据内容从这个 User 对象转移到 View 当中,但我们往往改了一个地方,忘了另一个地方,最终导致了产品运行崩溃。这也是我们关注的一部分,我们想摆脱所有这些比较蠢的代码。
当我们使用 Data Binding,它很像 Holder 模式,而且我们只要做一点点事情,其余的内容 Data Binding 会帮我们完成。
Data Binding引入---在我们app-->build.gradle加入
// dataBinding 加入 dataBinding { enabled = true }简单绑定
private ActivityMainBinding mBinding;protected void onCreate(Bundle savedInstanceState) { mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);}public void updateUI(User user) { mBinding.setUser(user);}
<LinearLayout …> <TextView android:text="@{user.name}"/> <TextView android:text="@{user.lastName}"/></LinearLayout>现在,当我看这些布局文件,我可以知道这些 TextView 要显示什么,它变得非常明显,所以我没必要再回到我当 Java 代码去阅读它们到底是干什么的。设计 Data Binding 库其中一个原因就是不想去用一些看起来不明显不直接的表达方式。使用 Data Binding,你只要简单地告诉它:“我们用这种类型的用户标记这个布局文件,现在我们将要找到它。”而如果你的产品设计经理要求你添加另一个新的 View 进去这个布局,你只要在这个布局文件中加上它无需改变其他 Java 代码:
<layout> <data> <variable name="user" type="com.android.example.User"/> </data> <LinearLayout …> <TextView android:text="@{user.name}"/> <TextView android:text="@{user.lastName}"/> <TextView android:text='@{"" + user.age}'/> </LinearLayout></layout>同时,也非常容易寻找 bug. 你可以看着类似上面的代码,这是空的字符串加上 user.age 这样写是安全正确的,而如果你只是把int设置给 text 了,它会误以为这是资源索引 resId,找不到对应的资源从而导致崩溃。
那么Data Binding是怎么工作的呢?
Data Binding 做的第一件事就是进入并处理布局文件,其中的“进入”指的是,在你的程序代码正在被编译的过程中,它会找出布局文件中所有关于它的内容,获取到它所需要的信息,然后删掉它们,删掉它们的原因是如果继续存着视图系统并不认得它们。
<TextView android:visibility="@user.isAdmin ? View.VISIBLE : View.GONE}"/>这个 user 是一个索引,之后的 View 也是个索引,另一个 View 也是个索引。它们都是索引或称标识.同样的对于 VISIBLE 和 GONE 也是如此。这里面有对象数据访问,是一个三目运算表达式,而对于Data Binding的库来说,它的工作就是从这些文件中把东西解析出来,了解里面有什么。
第三步就是在你代码编译过程中解决相关依赖问题。在这一步中,例如,我们看一下 user.isAdmin,想:“这是在运行时获取到 User 类对象中的一个布尔值。”
最后一步就是 Data Binding 会自动生成一些你不需要再写的类文件,总之到这里你只要享受它带来的好处就可以了。
forexample:
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.android.example.User"/> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="@{user.name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:text="@{user.lastname}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout></layout>当编译时 Data Binding 进入,它会读懂并丢掉所有视图系统不认识的内容,同时放上我们的绑定 tags(标志),变成这样:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/ android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:tag="binding_1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:tag="binding_2" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>这实际上就是如何做到数据绑定向后兼容
阅读全文
0 0
- Data Binding学习(一)
- Android Data Binding(一)
- Data Binding学习(二)
- Android Data Binding实战(一)
- 【MVVM】Android Data Binding实战(一)
- Android Data Binding学习
- Data Binding 摘要学习
- Data Binding 学习笔记
- Data binding学习
- Data Binding 学习
- android Data Binding讲解一
- Data Binding基础学习笔记
- Data binding的使用(一)-----hello word
- WPF的Binding学习笔记(一)
- (D3学习)绑定数据(binding data)
- angular学习(二)—— Data Binding
- angular学习(二)—— Data Binding
- Data Binding Library(Data Binding库官方指南)
- bzoj3209 花神的数论题 数位DP
- window.location.href的用法(动态输出跳转)
- 求数组中出现次数超过一半的数字
- tensorflow学习笔记之MNIST入门
- 高斯模糊算法
- Data Binding学习(一)
- 虚函数&多态
- Jenkins-部署(一)
- 1.1云存储技术的起源与发展
- 开源数据处理引擎 GeoTrellis 发布
- html+springMVC的拦截器token配置--解决ajax表单重复提交的问题
- codeforces 124A The number of positions
- 阿里云/腾讯 云服务器的使用方法
- 多态中方法的重写和方法的重载