web-dev-qa-db-fra.com

Liaison de données avec srcCompat

J'utilise le nouveau support de dessin vectoriel de Support Lib v23.2 avec app: srcCompat & tente de le définir via la liaison de données.

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">

<data>
    <variable
        name="mediaPojo"
        type="in.ishaan.pika.data_binding.MediaPojo"/>
</data>

<RelativeLayout
    Android:background="@color/black"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <VideoView
        ... />

    <ImageView
        ...
        app:srcCompat="@{mediaPojo.isPlaying ? @drawable/ic_pause_24dp : @drawable/ic_play_arrow_24dp}"
    />

    <ProgressBar
        .../>
</RelativeLayout>
</layout>

En essayant de construire, le studio jette:

Erreur: (33, 30) Impossible de trouver le configurateur pour l'attribut 'app: srcCompat' avec le type de paramètre Android.graphics.drawable.Drawable.

39
Ishaan Garg

Vous pouvez simplement utiliser l'attribut Android: src à la place de l'attribut compat lorsque vous définissez la ressource vectorielle par DataBinding. 

La bibliothèque DataBinding génère une classe qui exécute la méthode setImageResource _ à l'exécution.

<ImageView
        ...
        Android:src="@{@drawable/your_drawable}"
/>

Selon la méthode http://Android-developers.blogspot.com/2016/02/Android-support-library-232.htmlsetImageResource, elle peut être utilisée à l'exécution sur les anciennes versions du système sans changements supplémentaires.

Si vous souhaitez utiliser l'attribut app: srcCompat. Vous devez définir l'annotation @BindingMethods qui connecte l'attribut au configurateur approprié à partir de ImageView. Par exemple, dans votre activité ou votre fragment, ajoutez.

@BindingMethods({
    @BindingMethod(type = Android.widget.ImageView.class,
            attribute = "app:srcCompat",
            method = "setImageDrawable") })
public class MainActivity extends AppCompatActivity {
   // your activity body here

}
58
lukjar

Vous devrez peut-être recourir à un adaptateur de liaison avec une signature de méthode semblable à celle-ci:

@BindingAdapter("app:srcCompat")
public static void bindSrcCompat(ImageView imageView, Drawable drawable){
    // Your setter code goes here, like setDrawable or similar
}

Voici la référence: http://developer.Android.com/reference/Android/databinding/BindingAdapter.html

7
SeptimusX75

Les réponses proposées ont principalement fonctionné pour moi, mais je devais également ajouter cette ligne dans ma candidature:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

Cela me permet d’utiliser des dessins vectoriels dans des versions plus anciennes sans avoir à me soucier des classes ou des attributs compat 

1
gatti

si vous devez utiliser srcCompat et définir une teinte via XML sur vos tirables, utilisez Android.support.v7.widget. AppCompatImageView  

Et puis Android: teinte et application: srcCompat fonctionne parfaitement.

remarque: pour une raison inconnue de moi dans les mises en page de fragments, utiliser ImageView fonctionne bien. Le retour à AppCompatImageView n'est nécessaire que dans les présentations d'activité.

0
Rik van Velzen