J'ai vu le DataBindingComponent dans le document officiel de l'API.
https://developer.Android.com/reference/Android/databinding/DataBindingUtil.html
Cette interface est générée lors de la compilation pour contenir des getters pour tous les BindingAdapters d'instance utilisés. Lorsqu'un BindingAdapter est une méthode d'instance, une instance de la classe implémentant la méthode doit être instanciée. Cette interface sera générée avec un getter pour chaque classe avec le nom get * où * est le nom de classe simple de la classe/interface BindingAdapter déclarante. Les collisions de noms seront résolues en ajoutant un suffixe numérique au getter.
Une instance de cette classe peut également être passée à BindingAdapters statiques ou d'instance comme premier paramètre.
Si vous utilisez Dagger 2, le développeur doit étendre cette interface et annoter l'interface étendue en tant que composant.
Cependant, je ne trouve aucun exemple d'utilisation de cette classe sur le Web. Quelqu'un peut-il savoir ce que c'est et comment l'utiliser?.
J'ai essayé de faire du code simple et de le déboguer pour voir ce qu'il en est, mais il a montré une variable nulle sur la variable 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());
}
De la documentation nous savons
Cette interface est générée lors de la compilation pour contenir des getters pour tous les BindingAdapters d'instance utilisés. Lorsqu'un BindingAdapter est une méthode d'instance, une instance de la classe implémentant la méthode doit être instanciée. Cette interface sera générée avec un getter pour chaque classe avec le nom get * où * est le nom de classe simple de la classe/interface BindingAdapter déclarante. Les collisions de noms seront résolues en ajoutant un suffixe numérique au getter.
Une instance de cette classe peut également être passée à BindingAdapters statiques ou d'instance comme premier paramètre.
Si vous utilisez Dagger 2, le développeur doit étendre cette interface et annoter l'interface étendue en tant que composant.
Cela nous indique que cette interface est utilisée et générée pour injecter une usine pour les instances implémentant des méthodes @BindingAdapter
Personnalisées. De cette façon, vous pouvez configurer les liaisons de données pour différentes situations ou mises en page ou lui fournir un état plus général. Si vous regardez la classe DataBindingComponent
par défaut dans Android Studio, vous la trouverez dans build/generated/source/apt/dev .
Les méthodes que vous pouvez utiliser avec le DataBindingComponent
sont
Considérant que vous définissez une interface comme
public interface Foo {
@BindingAdapter("foobar")
void fooBar(View view, String baz);
}
une interface Android.databinding.DataBindingComponent
est générée
public interface DataBindingComponent {
di.pkg.Foo getFoo();
}
Cet hôte @BindingAdapter
Est désormais utilisé dans vos liaisons de données, mais vous devez implémenter l'interface vous-même et l'utiliser avec l'une des méthodes indiquées ci-dessus, comme
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);
}
};
}
});
Dans votre exemple, vous obtenez null de DataBindingUtil.getDefaultComponent()
parce que vous n'avez jamais défini vous-même le composant par défaut.
Après avoir lu la réponse de @tynn, la classe DataBindingComponent peut également être en tant que portée "objet" de la méthode de liaison de données. Au lieu de définir toute la méthode de manière statique, l'exemple suivant peut être utilisé pour être extensible et personnalisé. Par exemple, nous configurons 3 méthodes de liaison pour ImageView, TextView et View type. Vous pouvez d'abord configurer l'interface (comme l'interface de configuration de Retrofit 2 pour l'API)
1. Configuration de l'interface 3 en premier
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. Le DataBindingComponent.Java doit être mis à jour automatiquement comme @tynn mentionné comme suit.
Si vous regardez la classe DataBindingComponent par défaut dans Android Studio, vous la trouverez dans 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();
}
. Créez votre propre méthode d'implémentation pour la liaison.
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. Définissez votre 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. Configurez votre DataBindingComponent par défaut dans l'application
public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
DataBindingUtil.setDefaultComponent(new MyOwnDefaultDataBindingComponent());
}
}
L'utilisation de cette méthode devrait convenir pour rendre la liaison de données personnalisée d'une manière personnalisée et peut être extensible.