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.
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
}
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
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
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é.