使用Android DataBinding BindingAdapter和Dagger 2
使用Android 数据绑定库实现绑定适配器的典型方法是使用@BindingAdapter
注释创建静态方法,例如:
@BindingAdapter("android:imageUrl")
public static void loadImage(ImageView view, String url) {Picasso.get().load(url).into(view);
}复制代码
这已在网上广泛使用和讨论,并适用于很多个例(如果你熟悉DataBinding的话)。
但是,如果你想你的适配器具有很好耦合度,或者您不想在全局范围内定义它,该怎么办?
BindingAdapter
并不一定要是静态的......
创建非静态绑定适配器
不使用Dagger2也能实现
官方文档完全没有DataBinding的这种功能,但是在Stack Overflow上有一些例子。 我举个例子说明一下。 我创建了三个绑定适配器的接口类:
public interface ImageViewBindingInterface {@BindingAdapter({"bind:imageUrl", "bind:error"})public void loadImage(ImageView view, String url, Drawable error);
}
public interface TextViewBindingInterface {@BindingAdapter({"bind:font"})void setFont(TextView textView, String fontName);
}
public interface ViewBindingInterface {@BindingAdapter("android:paddingLeft")public void setPaddingLeft(View view, int padding);@BindingAdapter("android:onViewAttachedToWindow")public void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached);
}
复制代码
build一下,我们发现DataBindingComponent类是会自动生成的(在build / generated / source / apt / dev下)。 此接口包含为每个单独的适配器定义的getter:
public interface DataBindingComponent {ViewBindingInterface getViewBindingInterface();ViewBindingInterface getTextViewBindingInterface();ImageViewBindingInterface getImageViewBindingInterface();
}
复制代码
然后我们创建一个基类去实现它
public class BaseImageViewBinding implements ImageViewBindingInterface{@Overridepublic void loadImage(ImageView view, String url, Drawable error) {Picasso.with(view.getContext()).load(url).error(error).into(view);}
}public class BaseTextViewBinding implements TextViewBindingInterface {@Overridepublic void setFont(TextView textView, String fontName) {textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));}
}public class BaseViewBinding implements ViewBindingInterface {@Overridepublic void setPaddingLeft(View view, int padding) {view.setPadding(padding,view.getPaddingTop(),view.getPaddingRight(),view.getPaddingBottom());}@Overridepublic void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached) {}
}
复制代码
最后再设置你自己的DatabindingComponent
:
public class MyOwnDefaultDataBindingComponent implements android.databinding.DataBindingComponent {@Overridepublic ViewBindingInterface getViewBindingInterface() {return new BaseViewBinding();}@Overridepublic TextViewBindingInterface getTextViewBindingInterface() {return new BaseTextViewBinding();}@Overridepublic ImageViewBindingInterface getImageViewBindingInterface() {return new BaseImageViewBinding();}
}
复制代码
最后在Application中设置默认的DataBindingComponent
就可以了
public class MyApplication extends Application {public void onCreate() {super.onCreate();DataBindingUtil.setDefaultComponent(new MyOwnDefaultDataBindingComponent());}
}
复制代码
优化了一下,让自己的代码看起来更舒服,更低耦合。是不是也很简单呢?
使用Dagger2注入
让我们创建一个类似上面例子的简单适配器:
public class ImageBindingAdapter {private final Picasso picasso;public ImageBindingAdapter(Picasso picasso) {this.picasso = picasso;}@BindingAdapter("android:imageUrl")public void loadImage(ImageView view, String url) {picasso.load(url).fit().into(view);}
}
复制代码
Picasso现在不是每次都创建一个新的Picasso实例,而是作为一个依赖者传递给构造函数。特别是对于Picasso来说,如果你想使用构建器来创建一个自定义实例并且避免使用Picasso的多个实例,这可能会很有用。 以这种方式创建BindingAdapter
时,DataBinding
跟上面一样也会生成DataBindingComponent
接口
public interface DataBindingComponent {ImageBindingAdapter getImageBindingAdapter();
}复制代码
纵观DataBindingUtil
文档 ,我们可以看到有很多的利用方法DataBindingComponent
,比如setDefaultComponent
,inflate
和setContentView
(以后会更多)。
使用适配器的一种方法是创建一个具体的实现DataBindingComponent
,这可以手动完成,也可以使用Dagger 2来利用图形来提供任何外部依赖。
使用Dagger构建DataBindingComponent
应该可以创建组件或子组件,在此示例中,我选择使用组件,因为不必将整个图形暴露给绑定适配器。
组件需要一个范围,所以我@DataBinding
创建了一个Scope
作用域。
这是提供以下内容的Module ImageBindingAdapter
:
@Module
public class BindingModule {@Provides @DataBinding ImageBindingAdapter provideImageBindingAdapter(Picasso picasso) {return new ImageBindingAdapter(picasso);}
}复制代码
这是Component:
@DataBinding
@Component(dependencies = AppComponent.class, modules = BindingModule.class)
public interface BindingComponent extends DataBindingComponent {}复制代码
为了满足Picasso的依赖性,BindingModule
也必须由AppComponent
(如果使用子组件则不需要此步骤)所引用:
@Singleton
@Component(modules = {AppModule.class, BindingModule.class})
public interface AppComponent {private final Application application;public AppModule(Application application) {this.application = application;}Picasso picasso();
}复制代码
Build一下,Dagger会自动实现了所有的方法DataBindingComponent
。以下是自动生成的内容片段:
public final class DaggerBindingComponent implements BindingComponent {private Provider<ImageBindingAdapter> provideImageBindingAdapterProvider;@Overridepublic ImageBindingAdapter getImageBindingAdapter() {return provideImageBindingAdapterProvider.get();}....
}复制代码
使用Component
使用新组件的最简单方法是在Application
类中创建它,特别是如果在Dagger 2.10+中使用Android注入,因为您不再需要将主要组件在·Acitivity·中inject
。它现在是一个标准的Dagger组件,所以它只需要以正常的方式构建然后传递给它DataBindingUtil.setDefaultComponent(para)
。
这是一个示例Application
:
public class MyApplication extends Application {@Override public void onCreate() {super.onCreate();AppComponent appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build();appComponent.inject(this);BindingComponent bindingComponent = DaggerBindingComponent.builder().appComponent(appComponent).build();DataBindingUtil.setDefaultComponent(bindingComponent);}
}复制代码
这当然在全局范围内有效啦!!这个组件也可以与特定布局一起使用!!!:
在Activity
中:
DataBindingUtil.setContentView(this, R.layout.activity_layout, bindingComponent);
复制代码
Fragment
中:
DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false, bindingComponent);
复制代码
参考文章:
- developer.android.com/reference/a…
- philio.me/using-andro…
- stackoverflow.com/questions/3…
转载于:https://juejin.im/post/5c7f94256fb9a049fc04494a
使用Android DataBinding BindingAdapter和Dagger 2相关推荐
- Android DataBinding 从入门到进阶
DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰.MVVM 相对于 MVP,其 ...
- Android DataBinding之初体验
(一) 关于DataBinding Google推出DataBinding有一段时间,但是目前来看没有几个人用(尴尬),当然Google推出很多东西都没用户(哈哈),不过作为程序猿 学习这个东西还是很 ...
- Android 依赖注入: Dagger 2 实例解说(一)
本文原创,转载请注明出处:http://blog.csdn.net/zjbpku [Duplicated] link to Dagger on Android - Dagger2具体解释 关于D ...
- 解决Android 编译出错 找不到android.databinding.ViewDataBinding的类文件
报错如下: 错误: 无法访问ViewDataBinding 找不到android.databinding.ViewDataBinding的类文件 有关详细信息, 请参阅以下堆栈跟踪. com.sun. ...
- Android Databinding学习
一.启用Databinding android { dataBinding { enabled = true } } 二.xml布局文件 <layout xmln ...
- Android DataBinding RecyclerView AAPT: error: attribute adapter (aka......) not found.
Android dataBinding为RecyclerView设置adapter时 出现AAPT: error: attribute adapter (aka......) not found. 出 ...
- 初步认识android databinding
我先说一下我公司的情况,然后再说对android databinding的认识 记得去年6月份,我们公司开发的项目(主要是针对餐饮的)走进了市场,遇到了一些问题.客户都说我们产品虽然有一定的好处,但不 ...
- Android DataBinding使用总结(五)结合MultiType展示多类型列表
前言 在我的前几篇文章中,简单学习了以下内容: Android DataBinding使用总结 (一) DataBinding的环境配置和基本使用 Android DataBinding使用总结(二) ...
- Android DataBinding 入门了解 到实现一个buttton的点击事件
为了更好的学习mvvm 这里从新学习databinding.... 1 首先在app下面的Gradle 里面的android 里面 添加 dataBinding {enabled = true} 如下 ...
最新文章
- Ubuntu 新装服务器部署流程
- c语言编程员工信息排序,员工工资管理系统(c语言编程)
- mysql 调试分析利器_使用systemtap调试工具分析MySQL的性能
- 拿什么来衡量程序员的生产力?
- java实现对无符号整数的支持
- 再见 Postman!Apifox 才是 YYDS!
- System-Level Registers and Data Structures in IA-32e Mode and 4-Level Paging
- javascript class constructor
- 常用php操作redis命令整理(五)ZSET类型
- WPE封包外挂教程(上)
- sqlhelper java_java版sqlhelper
- 巴西电商olist store订单数据分析
- 飞饭网面试题 2014/9/2
- 调用微信公众号现金红包接口给用户发送红包
- C#程序设计第三版(李春葆)第12章文件操作课后习题答案
- 微信赌场——H5棋牌游戏渗透之旅
- 谷歌浏览器翻译失效解决方案,百试百灵
- Realtek RTL8762C/Realtek RTL8762D学习记录
- Java Web项目性能测试 - JMeter测试网站吞吐量、反应时间百分比、流量
- python 小游戏——外星人入侵源码倾情奉献