web-dev-qa-db-fra.com

Qu'est-ce que la classe "DataBindingComponent" dans Android liaison de données?

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

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.

19
tynn

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.

23
Long Ranger