使用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,比如setDefaultComponentinflatesetContentView(以后会更多)。

使用适配器的一种方法是创建一个具体的实现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相关推荐

  1. Android DataBinding 从入门到进阶

    DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰.MVVM 相对于 MVP,其 ...

  2. Android DataBinding之初体验

    (一) 关于DataBinding Google推出DataBinding有一段时间,但是目前来看没有几个人用(尴尬),当然Google推出很多东西都没用户(哈哈),不过作为程序猿 学习这个东西还是很 ...

  3. Android 依赖注入: Dagger 2 实例解说(一)

    本文原创,转载请注明出处:http://blog.csdn.net/zjbpku [Duplicated]   link to  Dagger on Android - Dagger2具体解释 关于D ...

  4. 解决Android 编译出错 找不到android.databinding.ViewDataBinding的类文件

    报错如下: 错误: 无法访问ViewDataBinding 找不到android.databinding.ViewDataBinding的类文件 有关详细信息, 请参阅以下堆栈跟踪. com.sun. ...

  5. Android Databinding学习

    一.启用Databinding android {     dataBinding {         enabled = true     } } 二.xml布局文件 <layout xmln ...

  6. Android DataBinding RecyclerView AAPT: error: attribute adapter (aka......) not found.

    Android dataBinding为RecyclerView设置adapter时 出现AAPT: error: attribute adapter (aka......) not found. 出 ...

  7. 初步认识android databinding

    我先说一下我公司的情况,然后再说对android databinding的认识 记得去年6月份,我们公司开发的项目(主要是针对餐饮的)走进了市场,遇到了一些问题.客户都说我们产品虽然有一定的好处,但不 ...

  8. Android DataBinding使用总结(五)结合MultiType展示多类型列表

    前言 在我的前几篇文章中,简单学习了以下内容: Android DataBinding使用总结 (一) DataBinding的环境配置和基本使用 Android DataBinding使用总结(二) ...

  9. Android DataBinding 入门了解 到实现一个buttton的点击事件

    为了更好的学习mvvm 这里从新学习databinding.... 1 首先在app下面的Gradle 里面的android 里面 添加 dataBinding {enabled = true} 如下 ...

最新文章

  1. Ubuntu 新装服务器部署流程
  2. c语言编程员工信息排序,员工工资管理系统(c语言编程)
  3. mysql 调试分析利器_使用systemtap调试工具分析MySQL的性能
  4. 拿什么来衡量程序员的生产力?
  5. java实现对无符号整数的支持
  6. 再见 Postman!Apifox 才是 YYDS!
  7. System-Level Registers and Data Structures in IA-32e Mode and 4-Level Paging
  8. javascript class constructor
  9. 常用php操作redis命令整理(五)ZSET类型
  10. WPE封包外挂教程(上)
  11. sqlhelper java_java版sqlhelper
  12. 巴西电商olist store订单数据分析
  13. 飞饭网面试题 2014/9/2
  14. 调用微信公众号现金红包接口给用户发送红包
  15. C#程序设计第三版(李春葆)第12章文件操作课后习题答案
  16. 微信赌场——H5棋牌游戏渗透之旅
  17. 谷歌浏览器翻译失效解决方案,百试百灵
  18. Realtek RTL8762C/Realtek RTL8762D学习记录
  19. Java Web项目性能测试 - JMeter测试网站吞吐量、反应时间百分比、流量
  20. python 小游戏——外星人入侵源码倾情奉献

热门文章

  1. 《UG NX8.0中文版完全自学手册》一2.4 布局
  2. iptables上课内容
  3. 在MVC3中使用code first生成数据局库并操作数据库
  4. 【原创】关于java中的lock
  5. ospf多区域路由实验
  6. apache配置php后访问localhost出现403错误
  7. 萌新的Python练习实例100例(五)输入三个整数x,y,z,请把这三个数由小到大输出。
  8. Delphi无法修改Clientdataset的字段的解决方法
  9. 过去几小时,以太坊2.0信标链主网超过75位验证者被Slash罚款
  10. Coinbase在今日比特币下跌时出现宕机