Что такое класс DataBindingComponent в привязке данных android?

Я видел DataBindingComponent в официальном документе API.

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

Этот интерфейс генерируется во время компиляции, чтобы содержать геттеры для всех используемых экземпляров BindingAdapters. Когда BindingAdapter является методом экземпляра, экземпляр класса, реализующего этот метод, должен быть инстанцирован. Этот интерфейс будет сгенерирован с помощью getter для каждого класса с именем get * где * – простое имя класса объявления класса / интерфейса BindingAdapter. Коллизии имен будут разрешены путем добавления числового суффикса к получателю.

Экземпляр этого класса также может быть передан в статический или экземпляр 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()); } 

Из документации, которую мы знаем

Этот интерфейс генерируется во время компиляции, чтобы содержать геттеры для всех используемых экземпляров BindingAdapters. Когда BindingAdapter является методом экземпляра, экземпляр класса, реализующего этот метод, должен быть инстанцирован. Этот интерфейс будет сгенерирован с помощью getter для каждого класса с именем get * где * – простое имя класса объявления класса / интерфейса BindingAdapter. Коллизии имен будут разрешены путем добавления числового суффикса к получателю.

Экземпляр этого класса также может быть передан в статический или экземпляр BindingAdapters в качестве первого параметра.

При использовании Dagger 2 разработчик должен расширить этот интерфейс и аннотировать расширенный интерфейс как компонент.

Это говорит о том, что этот интерфейс используется и генерируется для инъекции фабрики для экземпляров, реализующих пользовательские методы @BindingAdapter . Подобным образом вы можете настроить привязки данных для разных ситуаций или макетов или предоставить более общее состояние. Если вы посмотрите на класс DataBindingComponent по умолчанию в Android Studio, вы найдете его в файле build / generated / source / apt / dev .

Методы, которые вы можете использовать с DataBindingComponent – это

  • DataBindingUtil.setDefaultComponent ()
  • DataBindingUtil.inflate ()
  • DataBindingUtil.bind ()

Учитывая, что вы определяете интерфейс типа

 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); } }; } }); 

В вашем примере вы получаете null из DataBindingUtil.getDefaultComponent() потому что вы никогда не устанавливали компонент по умолчанию самостоятельно.

После прочтения ответа от @tynn класс DataBindingComponent также может быть «областью» объекта метода привязки данных. Вместо того, чтобы устанавливать все методы статическим способом, следующий пример можно использовать для расширения и настройки. Например, мы настраиваем 3 метода привязки для типов ImageView, TextView и View. Вы можете сначала настроить интерфейс (например, интерфейс настройки Retrofit 2 для API)

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()); } } 

Использование этого метода должно быть прекрасным, чтобы сделать настраиваемую привязку данных настраиваемым способом и может быть расширяемым.