2016-03-03 21 views
25

Używam nowego wektorowego wsparcia do rysowania w Support Lib v23.2 z aplikacją: srcCompat & próbując ustawić jej losowanie poprzez powiązanie danych.Data Binding with 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 stara się budować, studyjny rzuca:

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

+0

Czy umieściłeś atrybut 'xmlns: app =" http://schemas.android.com/apk/res-auto "' na głównym elemencie swojego układu? –

+0

@PaulDS yep, pozwól mi zaktualizować pytanie z pełnym układem –

Odpowiedz

34

Możesz po prostu użyć android: src atrybut zamiast atrybutu compat po ustawieniu zasobu wektorowego przez DataBinding.

Biblioteka DataBinding generuje klasę wykonującą w czasie wykonywania metodę setImageResource.

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

Według http://android-developers.blogspot.com/2016/02/android-support-library-232.htmlsetImageResource metoda może być stosowana w czasie wykonywania na starszych wersjach systemu bez żadnych dodatkowych zmian.

Jeśli chcesz użyć atrybutu : srcCompat. Musisz zdefiniować adnotację @BindingMethods, która łączy atrybut z odpowiednim ustawiaczem z ImageView. Na przykład dodaj do aktywności lub fragmentu.

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

} 
+0

_ "Biblioteka DataBinding generuje klasę, która wykonuje metodę setImageResource w czasie wykonywania." _ Jesteś tego pewien? Nie możesz otworzyć klas wiążących, więc skąd mamy mieć pewność? –

+1

Sprawdziłem dwie rzeczy: 1. Wyświetlanie wektorowy rozciągliwej na gotowych urządzeń Lolipop podczas korzystania z Androidem: atrybut src i DataBinding (Pokazuje bez wyjątku) 2. Jednym z engeeniers oprogramowania pracujących w Google twierdzi, tutaj (w Expression drzewa (8 : 01) sekcja) https://realm.io/news/data-binding-android-boyar-mount/ o dopasowaniu atrybutu src do metody setImageResource – lukjar

+0

Ponadto możesz spróbować znaleźć w swoim kodzie ImageViewBindingAdapter. Jest to adapter z biblioteki DataBinding służącej do wiązania ImageView. W wygenerowanym kodzie można znaleźć odniesienia do tego adaptera. Możesz otworzyć wygenerowane klasy używając na przykład NotePad ++ :) Ponieważ Android Studio domyślnie otwiera układ XML. Są one przechowywane w app \ build \ intermediates \ classes \ your \ package \ name \ databinding – lukjar

0

Proponowane odpowiedzi pracował głównie dla mnie, ale Musiałem także dodać tę linię w mojej aplikacji:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

Takie postępowanie pozwala mi korzystać z kanału alfa wektorowej w starszych wersjach, bez konieczności martwić compat klasy lub atrybuty

+0

Należy pamiętać, że użycie tej flagi powoduje problemy z pamięcią (https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88) –

Powiązane problemy