What is “DataBindingComponent” class in android databinding?

后端 未结 2 886
感动是毒
感动是毒 2021-01-31 04:43

I have seen the DataBindingComponent in the official API doc.

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

Th

2条回答
  •  没有蜡笔的小新
    2021-01-31 05:31

    After reading the answer from @tynn , the DataBindingComponent class can also be as "object" scope of data binding method. Instead of setting all the method in static way, the following example can be used to be extendable and custom. For example, we setup 3 binding methods for ImageView, TextView and View type. You can setup the interface first ( like Retrofit 2 setup interface for API)

    1. Setup 3 interface first

    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. The DataBindingComponent.java should be updated automatically as @tynn mentioned like the following.

    If you have a look at the default DataBindingComponent class in Android Studio you find it located in 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. Build your own implementation method for binding.

    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. Set your 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. Setup your default DataBindingComponent in the Application

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

    Using this method should be fine to make the custom data binding in a custom way and can be extensible.

提交回复
热议问题