什么是android数据绑定中的"DataBindingComponent"类?

Lon*_*ger 19 android android-databinding

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

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

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

也可以将此类的实例作为第一个参数传递给static或实例BindingAdapters.

如果使用Dagger 2,开发人员应扩展此接口并将扩展接口注释为Component.

但是,我在Web中找不到此类的任何示例用法.任何人都可以知道它是什么以及如何使用它.

我试着制作一些简单的代码并调试它以查看它是什么但它在变量上显示了null 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());
}
Run Code Online (Sandbox Code Playgroud)

Lon*_*ger 23

从@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);
}
Run Code Online (Sandbox Code Playgroud)

TextViewBindingInterface.java

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

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);
}
Run Code Online (Sandbox Code Playgroud)

2. DataBindingComponent.java应该像@tynn一样自动更新,如下所示.

如果你看一下Android Studio中的默认DataBindingComponent类,你会发现它位于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();
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

BaseTextViewBinding.java

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

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) {

    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyApplication extends Application {
    public void onCreate() {
        super.onCreate();
        DataBindingUtil.setDefaultComponent(new MyOwnDefaultDataBindingComponent());
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法可以很好地以自定义方式进行自定义数据绑定,并且可以是可扩展的.


tyn*_*ynn 20

从我们知道的文档中

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

也可以将此类的实例作为第一个参数传递给static或实例BindingAdapters.

如果使用Dagger 2,开发人员应扩展此接口并将扩展接口注释为Component.

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

您可以使用的方法DataBindingComponent

考虑你定义一个类似的界面

public interface Foo {
    @BindingAdapter("foobar")
    void fooBar(View view, String baz);
}
Run Code Online (Sandbox Code Playgroud)

android.databinding.DataBindingComponent生成一个接口

public interface DataBindingComponent {
    di.pkg.Foo getFoo();
}
Run Code Online (Sandbox Code Playgroud)

这个@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);
            }
        };
    }
});
Run Code Online (Sandbox Code Playgroud)

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