添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
踏实的鸡蛋面  ·  android ...·  2 小时前    · 
求醉的大白菜  ·  TS2345:'string ...·  6 小时前    · 
完美的消炎药  ·  MyBatis JPA Extra ...·  6 小时前    · 
温文尔雅的豆腐  ·  Developer Community·  10 月前    · 
温文尔雅的菠萝  ·  Stop using Options ...·  1 年前    · 
本文详细介绍了Android Data Binding库中的几个关键注解:Bindable、BindingAdapter、BindingConversion和BindingMethod的使用场景、代码定义、解析及示例,强调了它们在数据与UI交互中的重要作用,包括数据变更自动刷新UI、自定义视图赋值逻辑、数据类型转换和setter方法重命名。 摘要由CSDN通过智能技术生成

Bindable

data binding的意义主要数据的变动可以自动触发UI界面的刷新。但是如果我们使用的是传统的java bean对象的时候,是没有办法实现“数据变更触发ui界面”的目的的。而 Bindable 注解就是帮助我们完成这个任务的。

如果我们要实现“数据变更触发ui界面”的话,途径主要有两个:
1. 继承 BaseObservable ,使用 Bindable 注解field的getter并且在调用setter的使用使用 OnPropertyChangedCallback#onPropertyChanged
2. 使用data-binding library当中提供的诸如 ObservableField<> , ObservableInt 作为属性值

* The Bindable annotation should be applied to any getter accessor method of an * {@link Observable} class. Bindable will generate a field in the BR class to identify * the field that has changed. * @see OnPropertyChangedCallback#onPropertyChanged(Observable, int) @Target ({ElementType.FIELD, ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) // this is necessary for java analyzer to work public @ interface Bindable {

根据上面代码中的注释我们可以知道, Bindable 是对继承了 Observable 的类当中的 getter 方法进行注解。并且当我们使用了这个注解的时候,databinding library 会在 BR 这个类当中生成一个属性,用以标识发生了变化的属性field

public class PrivateUser extends BaseObservable{
    private String fistName;
    private String lastName;
    public PrivateUser(String fistName, String lastName) {
        this.age = age;
        this.fistName = fistName;
        this.lastName = lastName;
    @Bindable
    public String getFistName() {
        return fistName;
    public void setFistName(String fistName) {
        this.fistName = fistName;
        notifyPropertyChanged(BR.fistName);
    @Bindable
    public String getLastName() {
        return lastName;
    public void setLasetName(String lasetName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
 
  • 根据 Bindable 的定义可以发现,Bindable 是支持对属性进行注解的,所以当我们的属性是public的(不需要通过getter进行访问)的时候,是可以在属性上面使用该注解的。但是改变属性的值的时候是一定要调用 onPropertyChanged() 这个方法的,否则无法实现通知刷新UI的功能;
  • 上面频繁出现的 BR 这个类是在编译的时候生成的,使用的时候可能会发现ide没办法找到我们的属性,比如BR.lastName ,只要rebuild一下就可以了。
  • BindingAdapter

    当我们使用data binding的时候,data-binding library会尽可能的找到给view对应的属性(Attribute)进行赋值的方法,通常这个方法的名称就是set${Attribute}。这时候属性前面的命名空间会被忽略,而只关注属性的名称。比如我们数据绑定了TextView的 android:text 属性,那么data-binding library会去寻找 setText(String) 这样的一个方法。

    BindingAdapter 注解的方法能够控制给view赋值的操作过程,也就是说可以实现自定义setter的实现。对于那些不具备对应setter方法的属性(比如我们要绑定一个 android:paddingLeft 的属性的时候,我们却只有 setPadding(left, top, right, bottom) 这样的一个setter方法),那么我们可以通过BindingAdapter 注解来实现一个自定义的setter;比如我们希望给ImageView设置了一个字符串URL的值的时候,ImageView能够根据这个URL进行自主的联网下载图片的操作。

    此外我们还可以覆盖原有的setter方法的逻辑,比如我们使用 BindingAdapter 的时候参数传入的是 android:text ,那么我们方法的实现逻辑就会复写原来的setText(String)的方法逻辑了

    @Target(ElementType.METHOD)
    public @interface BindingAdapter {
         * @return The attributes associated with this binding adapter.
        String[] value();
         * Whether every attribute must be assigned a binding expression or if some
         * can be absent. When this is false, the BindingAdapter will be called
         * when at least one associated attribute has a binding expression. The attributes
         * for which there was no binding expression (even a normal XML value) will
         * cause the associated parameter receive the Java default value. Care must be
         * taken to ensure that a default value is not confused with a valid XML value.
    android:layout_width=“match_parent”
    android:layout_height=“match_parent”
    android:orientation=“vertical”
    android:padding=“20dp”
    tools:c
    				
    前言上一节,我们对DataBinding进行了简单的了解和使用,相信你已经有了基本的认识。这一节,我们将对DataBinding的初始化原理进行学习,当然我们不做深度的解析,毕竟,大多数的朋友们更关注的是如何将它运用到项目中。 高能君:前方高能,内容可能枯燥无味,感兴趣的朋友可以了解一下,不感兴趣的朋友赶紧跳过进入下一节吧。 android.binding Bindingandroid:text="@{String.valueOf(index + 1)}" android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}" android:background="@{true ? @color/co..
    Android DataBinding github 传送门 https://github.com/itrenjunhua/AndroidDataBinding 简单使用数据绑定 1、添加 Android DataBinding 支持 Android studio 需要在1.3以上,在module级别的gradle中添加大DataBinding支持 android { data...
    一、动态变量 有时候我们可能不知道Binding类的名称,比如RecyclerView.Adapter中item布局可能有很多,并不会对应特定的Binding类,但任然需要通过onBindViewHolder(VH, int )去绑定数据 public void onBindViewHolder(BindingHolder holder, int position) { final T it...
    a. 在BindingAdapter中定义 @BindingAdapter({"position", "info"}) public static void renderView(View view, int position, Info info) { view.renderView( @JvmStatic @BindingAdapter("imageurl") fun loadImage(imageView: ImageView, url: String) { Glide.wit...