2016-03-03 22 views
25

Sto utilizzando il nuovo supporto vettoriale estraibile in Support Lib v23.2 con app: srcCompat & cercando di impostare il suo drawable tramite associazione dati.Associazione dati con srcCompat

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

On cercando di costruire, studio getta:

Error:(33, 30) Cannot find the setter for attribute 'app:srcCompat' with parameter type android.graphics.drawable.Drawable.

+0

Hai incluso l'attributo 'xmlns: app =" http://schemas.android.com/apk/res-auto "nell'elemento root del tuo layout? –

+0

@PaulDS sì, permettimi di aggiornare la domanda con il layout completo –

risposta

34

È possibile utilizzare semplicemente android: src attributo invece attributo compat quando si imposta la risorsa vettoriale tramite DataBinding.

DataBinding library genera una classe che esegue il metodo setImageResource in fase di esecuzione.

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

Secondo http://android-developers.blogspot.com/2016/02/android-support-library-232.htmlsetImageResource metodo può essere utilizzato in fase di esecuzione su versioni più vecchie del sistema, senza ulteriori modifiche.

Se si desidera utilizzare l'app : srcCompat. È necessario definire l'annotazione @BindingMethods che collega l'attributo con il setter appropriato da ImageView. Ad esempio nel tuo Aggiungi attività o Frammento.

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

} 
+0

_ "La libreria DataBinding genera una classe che esegue il metodo setImageResource in fase di esecuzione." _ Sei sicuro? Non è possibile aprire le classi vincolanti, quindi come possiamo essere sicuri? –

+1

ho controllato due cose: 1. Visualizzazione vettore drawable sui dispositivi lolipop pre quando si utilizza Android: attributo src e DataBinding (Esso mostra senza eccezioni) 2. Uno dei engeeniers software che lavorano in Google dice qui (in Expression albero (8 : 01) sezione) https://realm.io/news/data-binding-android-boyar-mount/ sulla corrispondenza dell'attributo src con il metodo setImageResource – lukjar

+0

Inoltre puoi provare a trovare nel tuo codice ImageViewBindingAdapter. È un adattatore della libreria DataBinding utilizzato per associare ImageView. Nel codice generato è possibile trovare riferimenti a questo adattatore. È possibile aprire le classi generate utilizzando, ad esempio, NotePad ++ :) Poiché Android Studio apre il layout xml per impostazione predefinita. Sono memorizzati in app \ build \ intermediates \ classes \ your \ package \ name \ databinding – lukjar

0

Le risposte proposte lavorato principalmente per me, ma ho anche bisogno di aggiungere questa riga nella mia domanda:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

In questo modo mi permette di utilizzare drawable vettoriali in versioni precedenti senza bisogno di preoccuparsi di compat classi o attributi

+0

Ricorda che l'utilizzo di questo flag causa problemi di memoria (https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88) –

Problemi correlati