web-dev-qa-db-ja.com

srcCompatを使用したデータバインディング

Support Lib v23.2の新しいベクタードロウアブルサポートをapp: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)パラメータータイプAndroid.graphics.drawable.Drawableの属性 'app:srcCompat'のセッターが見つかりません。

46
Ishaan Garg

DataBindingでベクターリソースを設定する場合、compat属性の代わりにAndroid:src属性を使用するだけです。

DataBindingライブラリは、実行時にsetImageResourceメソッドを実行するクラスを生成します。

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

http://Android-developers.blogspot.com/2016/02/Android-support-library-232.htmlsetImageResourceメソッドによると追加の変更なしで、古いシステムバージョンの実行時に使用されます。

app:srcCompat属性を使用する場合。 ImageViewの適切なセッターに属性を接続する@BindingMethodsアノテーションを定義する必要があります。たとえば、アクティビティまたはフラグメントに追加します。

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

}
66
lukjar

次のようなメソッドシグネチャを持つバインディングアダプタを使用する必要がある場合があります。

@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

9
SeptimusX75

提案された回答は主に私にとってはうまくいきましたが、アプリケーションに次の行を追加する必要もありました:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

そうすることで、compatクラスや属性を気にすることなく、古いバージョンでベクタードロウアブルを使用できます。

1
gatti

srcCompatを使用する必要があり、Drawableでxmlを使用して色合いを設定する必要がある場合、最も簡単な方法はAndroid.support.v7.widgetを使用することです。AppCompatImageView

そしてAndroid:tintおよびapp:srcCompatは問題なく動作します。

注:ImageViewを使用したフラグメントレイアウトでは、何らかの理由で私には不明ですが、正常に動作します。 AppCompatImageViewへの復帰は、アクティビティレイアウトでのみ必要です。

0
Rik van Velzen