Подтвердить что ты не робот

Связывание данных с srcCompat

Я использую новую поддерживаемую векторную поддержку в Support Lib v23.2 с приложением: 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>

При попытке создания, студийные броски:

Ошибка: (33, 30) Не удается найти установщик для атрибута "app: srcCompat" с типом параметра android.graphics.drawable.Drawable.

4b9b3361

Ответ 1

Вы можете просто использовать атрибут android: src вместо атрибута compat при установке векторного ресурса DataBinding.

Библиотека DataBinding генерирует класс, выполняющий метод setImageResource во время выполнения.

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

В соответствии с http://android-developers.blogspot.com/2016/02/android-support-library-232.html метод setImageResource может использоваться во время выполнения в старых версиях системы без каких-либо дополнительных изменений.

Если вы хотите использовать атрибут app: srcCompat. Вы должны определить аннотацию @BindingMethods, которая связывает атрибут с соответствующим установщиком из ImageView. Например, в вашей деятельности или фрагменте добавьте.

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

}

Ответ 2

Возможно, вам придется прибегнуть к использованию адаптера привязки с сигнатурой метода, подобной следующей:

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

Вот ссылка: http://developer.android.com/reference/android/databinding/BindingAdapter.html

Ответ 3

Предлагаемые ответы в основном работали для меня, но я также должен был добавить эту строку в свое приложение:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

Это позволяет мне использовать векторные чертежи в старых версиях, не беспокоясь о классах или атрибутах сопоставления