Enlace de datos con srcCompat

Estoy utilizando el nuevo soporte vectorial dibujable en Support Lib v23.2 con app: srcCompat & tratando de establecer su capacidad de dibujar a través de enlace de datos.

<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> 

Al intentar construir, el estudio lanza:

Error: (33, 30) No se puede encontrar el setter para el atributo 'app: srcCompat' con el tipo de parámetro android.graphics.drawable.Drawable.

Simplemente puede utilizar el atributo android: src en lugar de atributo compat cuando se establece recurso vectorial por DataBinding.

La biblioteca DataBinding genera una clase que ejecuta el método setImageResource en tiempo de ejecución.

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

De acuerdo con http://android-developers.blogspot.com/2016/02/android-support-library-232.html método setImageResource se puede utilizar en tiempo de ejecución en las versiones anteriores del sistema sin ningún cambio adicional.

Si desea utilizar el atributo app: srcCompat . Debe definir la anotación @BindingMethods que conecta el atributo con el setter apropiado de ImageView. Por ejemplo en su Actividad o Fragmento agregar.

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

Puede que tenga que recurrir a utilizar un adaptador de enlace con una firma de método similar a lo siguiente:

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

Aquí está la referencia: http://developer.android.com/reference/android/databinding/BindingAdapter.html

Las respuestas propuestas funcionaron principalmente para mí, pero también necesitaba agregar esta línea en mi aplicación:

 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

Hacerlo me permite usar elementos extraíbles en versiones anteriores sin tener que preocuparme por las clases o atributos compatibles

  • ¿Cómo puedo crear preferencias personalizadas usando la biblioteca android.support.v7.preference?
  • Cómo manejar onContextItemSelected en una actividad de múltiples fragmentos?
  • Cómo obtener la barra de herramientas de fragmento?
  • Vector Drawable no se puede cargar correctamente en Android API 19 con la ayuda de Support Library (23.4.0)
  • El comportamiento de popBackStack () difiere después de la actualización de la biblioteca de soporte de 23.1.1 a 25.1.0
  • ¿La duración especificada en una animación definida por XML es realmente en milisegundos?
  • Error al utilizar elementos de la biblioteca de soporte de diseño de Android
  • Incluso estoy usando MenuItemCompat.setOnActionExpandListener mi aplicación se bloquea con aconsejar utilizar MenuItemCompat.setOnActionExpandListener
  • Mientras uso la biblioteca de soporte técnico estoy recibiendo un error que el atributo "" ya ha sido definido en android
  • Travis CI Android - No encuentra la versión que coincide
  • Android.app.Fragment $ InstantiationException: Tratando de instanciar una clase ScannerFragment que no es un fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.