Data Binding Component详解 - 换肤什么的只是它的一个小应用!
2017-12-27 13:25
423 查看
上一篇从零开始的Android新项目8 - Data Binding高级篇中,我们提到了使用Component来进行注入,以方便进行测试的功能,有一些朋友说写的不够清楚,还有些疑惑,所以本篇就来详细说说Component。
作为例子,我们的实现目标是使用Data Binding Component,让应用全局的TextView的文本都能随时变成test,还能进行全局换肤。
代码位于DataBindingSample里面的component包下。
当一个BindingAdapter是一个实例方法(instance method),一个实现该方法的类的实例必须被实例化。这个生成的接口会包含每个声明BindingAdapter的类/接口的get方法。命名冲突会简单地加一个数字前缀到get方法前来解决。
如果使用Dagger 2,开发者可以继承这个接口,并把继承的接口注解为Component。
对应的接口有:
setDefaultComponent(DataBindingComponent))
inflate(LayoutInflater, int, ViewGroup, boolean, DataBindingComponent)), inflate一个binding layout并返回新创建的binding
bind(View, DataBindingComponent)), 根据给定的layout root返回binding,如果没有则创建
第一个接口全局起作用,后两个接口仅对该语句inflate的布局起作用。
我们声明一个抽象的adapter,在其中写上抽象方法来设置我们想要做data binding的属性,这里我们直接干掉了TextView的android命名空间下的text和textColor两个属性。
这里的
前者使用的是原来的设置,后者则分别给text加上了” test”后缀,并做了color的转换,实现了字体颜色的“换肤”功能。
生产环境Component:
测试环境Component:
设置后
其使用场景很多,如:
换肤
打点
替换原生属性
等等
欢迎大家发挥自己的想象力,补充更多的使用场景。
转自:http://blog.zhaiyifan.cn/2016/07/21/data-binding-component/
作为例子,我们的实现目标是使用Data Binding Component,让应用全局的TextView的文本都能随时变成test,还能进行全局换肤。
代码位于DataBindingSample里面的component包下。
DataBindingComponent接口
在build/intermediates/classes下面,可以找到
DataBindingComponent类,包名为
android.databinding,全局只会有一个该类——此接口在编译时生成,包含了所有用到的实例BindingAdapters的getter方法。
当一个BindingAdapter是一个实例方法(instance method),一个实现该方法的类的实例必须被实例化。这个生成的接口会包含每个声明BindingAdapter的类/接口的get方法。命名冲突会简单地加一个数字前缀到get方法前来解决。
如果使用Dagger 2,开发者可以继承这个接口,并把继承的接口注解为Component。
对应的接口有:
setDefaultComponent(DataBindingComponent))
inflate(LayoutInflater, int, ViewGroup, boolean, DataBindingComponent)), inflate一个binding layout并返回新创建的binding
bind(View, DataBindingComponent)), 根据给定的layout root返回binding,如果没有则创建
第一个接口全局起作用,后两个接口仅对该语句inflate的布局起作用。
创建Component
声明抽象adapter
如果不需要实现多个Component,可以直接跳过这一步。我们声明一个抽象的adapter,在其中写上抽象方法来设置我们想要做data binding的属性,这里我们直接干掉了TextView的android命名空间下的text和textColor两个属性。
这里的
@BindingAdapter注解会让data binding在component中生成我们这个adapter的get方法(必须是非静态的)。
12345678 | public abstract class MyBindingAdapter { @BindingAdapter("android:text") public abstract void setText(TextView view, String value); @BindingAdapter("android:textColor") public abstract void setTextColor(TextView view, int value);} |
实现adapter
我们继承MyBindingAdapter分别实现两个adapter:
ProductionBindingAdapter.java:
123456789101112 | public class ProductionBindingAdapter extends MyBindingAdapter { @Override public void setText(TextView view, String value) { TextViewBindingAdapter.setText(view, value); } @Override public void setTextColor(TextView view, int value) { view.setTextColor(value); }} |
TestBindingAdapter.java:
123456789101112131415161718 | public class TestBindingAdapter extends MyBindingAdapter { @Override public void setText(TextView view, String value) { view.setText(value + " test"); } @Override public void setTextColor(TextView view, int value) { if (value == view.getContext() .getResources() .getColor(R.color.textColorDay)) { view.setTextColor(view.getContext() .getResources() .getColor(R.color.textColorNight)); } }} |
实现component
在写了上面的代码后,再看看DataBindingComponent,会发现里面多了一个接口方法,遂实现之:
生产环境Component:
123456789 | public class ProductionComponent implements DataBindingComponent { private MyBindingAdapter mAdapter = new ProductionBindingAdapter(); @Override public MyBindingAdapter getMyBindingAdapter() { return mAdapter; }} |
123456789 | public class TestComponent implements DataBindingComponent { private MyBindingAdapter mAdapter = new TestBindingAdapter(); @Override public MyBindingAdapter getMyBindingAdapter() { return mAdapter; }} |
使用
layout
原先的text和textColor属性并没有通过data binding设置,我们要给它们套上@{}:
123456 | <Button android:layout_width="match_parent" android:layout_height="50dp" android:onClick="@{presenter.onClickSimpleDemo}" android:text="@{@string/demo_simple}" android:textColor="@{@color/textColorDay}"/> |
注入component
注入Component很简单,我们做全局的注入只需要调用:12345 | if (DemoApplication.isTest) { DataBindingUtil.setDefaultComponent(new ProductionComponent());} else { DataBindingUtil.setDefaultComponent(new TestComponent());} |
重新创建activity
由于点击事件在MainActivity创建后才触发,所以这个activity上并不会起作用,我们需要重新创建它:
123456789 | public void onClickInjectDemo(View view) { if (DemoApplication.isTest) { DataBindingUtil.setDefaultComponent(new ProductionComponent()); } else { DataBindingUtil.setDefaultComponent(new TestComponent()); } DemoApplication.isTest = !DemoApplication.isTest; recreate();} |
recreate()即可。可以看demo工程的效果,点击最后的按钮后,字体颜色发生变化,textview的text后面都加上了test字符串。
静态adapter方法
那么静态的BindingAdapter方法怎么去和Component做关联呢?很简单,只需要作为方法的第一个参数就可以了:12345 | @BindingAdapter("android:src")public static void loadImage(TestComponent component, ImageView view, String url) { /// ...} |
结
本篇我们实践了Data Binding中比较高级的特性:Component。其使用场景很多,如:
换肤
打点
替换原生属性
等等
欢迎大家发挥自己的想象力,补充更多的使用场景。
转自:http://blog.zhaiyifan.cn/2016/07/21/data-binding-component/
相关文章推荐
- Data Binding Component详解 - 换肤什么的只是它的一个小应用!
- 【系统学习SpringBoot】再遇Spring Data JPA之JPA应用详解(自定义查询及复杂查询)
- 在Android开发过程中搭建一个自己的应用框架有几个步骤?需要注意什么?
- Java EE是 J2EE的一个新的名称,之所以改名,目的还是让大家清楚J2EE只是Java企业应用.随着WEB和EJB容器概念诞生,使得软件应用业开始担心SUN的伙伴们是否还在Java平台上不断推出
- 一个应用的什么最重要
- 如何开发一个JDBC应用详解!
- Android DataBinding使用详解(二)
- 一个应用实例详解卡尔曼滤波及其算法实现
- 第三章:Creating Applications and activities-(一)什么组成了一个Android应用
- Flex Data Binding详解
- IE userdata 原理 应用 详解
- Android干净架构详解:为你的应用打造一个清爽的架构!
- ComponentOne WebChart的一个应用实例
- Android Data Binding数据绑定详解
- 配置一个Spring Boot应用的过程详解
- Jackson应用一 Simple data binding
- 一个应用实例详解卡尔曼滤波及其算法实现
- Flex Data Binding详解
- Android开发判断一个app应用是否在运行的方法详解
- 【iOS开发】什么是Bundle,每个iOS应用实际上是一个Bundle