【问题标题】:What is "DataBindingComponent" class in android databinding?什么是 android 数据绑定中的“DataBindingComponent”类?
【发布时间】:2016-09-02 03:26:34
【问题描述】:

我在官方 API 文档中看到了 DataBindingComponent。

https://developer.android.com/reference/android/databinding/DataBindingUtil.html

此接口在编译期间生成,用于包含 getter 所有使用的实例 BindingAdapters。当 BindingAdapter 是 实例方法,实现该方法的类的实例必须 被实例化。此接口将使用 getter 生成 每个名称为 get* 的类,其中 * 是 声明 BindingAdapter 类/接口。名称冲突将是 通过向 getter 添加数字后缀来解决。

这个类的实例也可以传入静态或实例 BindingAdapters 作为第一个参数。

如果使用 Dagger 2,开发者应该扩展这个接口并且 将扩展接口注释为组件。

但是,我在网络上找不到此类的任何示例用法。谁能知道它是什么以及如何使用它。

我尝试编写一些简单的代码并对其进行调试以查看它是什么,但它在a 变量上显示了空变量。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
    android.databinding.DataBindingComponent a = DataBindingUtil.getDefaultComponent();
    setContentView(binding.getRoot());
}

【问题讨论】:

标签: android android-databinding


【解决方案1】:

阅读@tynn 的回答后,DataBindingComponent 类也可以作为数据绑定方法的“对象”范围。不是以静态方式设置所有方法,而是可以使用以下示例进行扩展和自定义。例如,我们为 ImageView、TextView 和 View 类型设置了 3 种绑定方法。您可以先设置接口(如 API 的 Retrofit 2 设置接口)

1.先设置3界面

ImageViewBindingInterface.java

public interface ImageViewBindingInterface {
    @BindingAdapter({"bind:imageUrl", "bind:error"})
    public  void loadImage(ImageView view, String url, Drawable error);
}

TextViewBindingInterface.java

public interface TextViewBindingInterface {
    @BindingAdapter({"bind:font"})
      void setFont(TextView textView, String fontName);
}

ViewBindingInterface.java

public interface ViewBindingInterface {
    @BindingAdapter("android:paddingLeft")
    public  void setPaddingLeft(View view, int padding);
    @BindingAdapter("android:onViewAttachedToWindow")
    public  void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached);
}

2。 DataBindingComponent.java 应该像@tynn 提到的那样自动更新,如下所示。

如果您查看了默认的 DataBindingComponent 类 Android Studio 你发现它位于 build/generated/source/apt/dev.

public interface DataBindingComponent {
    example.com.testerapplication.binding.ViewBindingInterface getViewBindingInterface();
    example.com.testerapplication.binding.TextViewBindingInterface getTextViewBindingInterface();
    example.com.testerapplication.binding.ImageViewBindingInterface getImageViewBindingInterface();
}

3.构建自己的绑定实现方法。

BaseImageViewBinding.java

public class BaseImageViewBinding implements ImageViewBindingInterface{
    @Override
    public void loadImage(ImageView view, String url, Drawable error) {
          Picasso.with(view.getContext()).load(url).error(error).into(view);
    }
}

BaseTextViewBinding.java

public class BaseTextViewBinding implements TextViewBindingInterface {
    @Override
    public void setFont(TextView textView, String fontName) {
        textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
    }
}

BaseViewBinding.java

public class BaseViewBinding implements ViewBindingInterface {
    @Override
    public void setPaddingLeft(View view, int padding) {
        view.setPadding(padding,
                view.getPaddingTop(),
                view.getPaddingRight(),
                view.getPaddingBottom());
    }
    @Override
    public void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached) {

    }
}

4.设置你的 OwnDatabindingComponent

public class MyOwnDefaultDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public ViewBindingInterface getViewBindingInterface() {
        return new BaseViewBinding();
    }
    @Override
    public TextViewBindingInterface getTextViewBindingInterface() {
        return new BaseTextViewBinding();
    }
    @Override
    public ImageViewBindingInterface getImageViewBindingInterface() {
        return new BaseImageViewBinding();
    }
}

5.在应用程序中设置默认的 DataBindingComponent

public class MyApplication extends Application {
    public void onCreate() {
        super.onCreate();
        DataBindingUtil.setDefaultComponent(new MyOwnDefaultDataBindingComponent());
    }
}

使用此方法应该可以以自定义方式进行自定义数据绑定,并且可以扩展。

【讨论】:

    【解决方案2】:

    documentation我们知道

    此接口在编译期间生成,以包含所有使用的实例 BindingAdapter 的 getter。当 BindingAdapter 是实例方法时,必须实例化实现该方法的类的实例。该接口将为每个名为 get* 的类生成一个 getter,其中 * 是声明 BindingAdapter 类/接口的简单类名。名称冲突将通过在 getter 中添加数字后缀来解决。

    这个类的一个实例也可以作为第一个参数传入静态或实例BindingAdapters。

    如果使用 Dagger 2,开发者应该扩展这个接口,并将扩展的接口注解为一个组件。

    这告诉我们该接口用于为实现自定义@BindingAdapter 方法的实例注入工厂。像这样,您可以为不同的情况或布局配置数据绑定,或者为其提供更一般的状态。如果您查看 Android Studio 中的默认 DataBindingComponent 类,您会发现它位于 build/generated/source/apt/dev

    DataBindingComponent 可以使用的方法是

    考虑到你定义了一个类似的接口

    public interface Foo {
        @BindingAdapter("foobar")
        void fooBar(View view, String baz);
    }
    

    生成一个android.databinding.DataBindingComponent 接口

    public interface DataBindingComponent {
        di.pkg.Foo getFoo();
    }
    

    这个@BindingAdapter 主机现在在您的数据绑定中使用,但您需要自己实现接口并将其与上面给出的方法之一一起使用,例如

    DataBindingUtil.setDefaultComponent(new DataBindingComponent(){
        @Override
        public Foo getFoo() {
            return new Foo() {
                @Override
                public void fooBar(View view, String baz) {
                    if (view instanceof TextView) ((TextView) view).setText(baz);
                }
            };
        }
    });
    

    在您的示例中,您从 DataBindingUtil.getDefaultComponent() 得到 null,因为您自己从未设置过默认组件。

    【讨论】:

    • 您的第三个代码尖晶石显示编译时错误,因为“Foo”类不是“android.databinding.DataBindingComponent”的类型。如果我理解正确的话,这个 DataBindingComponent 可以用作开发第三方数据绑定库,因为可以实现接口,并且可以手动设置组件(这意味着可以在 OOP 中开发)。
    • 你是对的。我忘了实现组件本身。我不是 100% 确定 @BindingAdapter 如何与库一起使用。 DataBindingComponent 可以与依赖注入一起使用,而不是静态方法。更容易更改实施。
    • 感谢您的解释。我会尝试创建一个示例以使绑定更加灵活,因为该指南引导开发人员编写一些用于绑定的静态方法,而不是将其作为对象或可扩展。
    猜你喜欢
    • 2017-05-18
    • 2010-09-06
    • 2017-10-02
    • 2019-06-27
    • 2017-01-14
    • 2020-03-24
    • 2019-01-24
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多