web-dev-qa-db-ja.com

Android DataBinding Custom Binding Adapter警告

Custom Binding Adapter for image loading from from official Android Developers site: http:// developer.Android.com/tools/data-binding/guide.html

コードを正常にコンパイルした後、次の警告が表示されます。

Warning:Application namespace for attribute bind:imageUrl will be ignored.

私のコードは次のとおりです:

@BindingAdapter({"bind:imageUrl"})
    public static void loadImage(final ImageView imageView, String url) {
        imageView.setImageResource(R.drawable.ic_launcher);
        AppController.getUniversalImageLoaderInstance().displayImage(url, imageView);
    }

この警告が生成される理由

スクリーンショットも添付されています... enter image description here

50
asad.qazi

名前空間はBindingAdapterアノテーションで本当に無視されると思います。名前空間プレフィックスを使用すると、レイアウトで使用されているものと一致するかどうかに関係なく、警告が発生します。名前空間を省略すると、次のようになります。

@BindingAdapter({"imageUrl"})

...警告は発生しません。

文字列が注釈の実装でキーとして使用される前にネームスペースが削除されることを警告する警告が存在すると思われます。これは、レイアウトが自由に名前空間を宣言できると考えると意味があります。 app:またはbind:またはfoo:、および注釈はこれらすべてのケースで機能する必要があります。

90
Lorne Laliberte

実際、BindingAdapterアノテーションにプレフィックスを追加するチュートリアルがまだあります。

接頭辞なしで@BindingAdapter({"imageUrl"})を使用します。

_<ImageView
    imageUrl="@{url}"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />
_

プロのヒント

BindingAdapterで_Android:_プレフィックスを使用しても警告は表示されません。それが奨励されているからです。新しい属性を作成する代わりに、@BindingAdapter("Android:src")を使用することをお勧めします。

_@BindingAdapter("Android:src")
public static void setImageDrawable(ImageView view, Drawable drawable) {
    view.setImageDrawable(drawable);
}
_

そして

_@BindingAdapter("Android:src")
public static void setImageFromUrl(ImageView view, String url) {
   // load image by glide, piccaso, that you use.
}
_

必要な場合にのみ新しい属性を作成します。

2
Khemraj

これを試して、私のために働いてください!これがあなたのお役に立てば幸いです。アダプタをバインドせずに画像リソースを変更する簡単な方法。

<ImageButton
        ...
        Android:id="@+id/btnClick"
        Android:onClick="@{viewModel::onClickImageButton}"
        Android:src="@{viewModel.imageButton}" />

およびモデルクラスの表示:

public ObservableField<Drawable> imageButton;
private Context context;

//Constructor
public MainVM(Context context) {
    this.context = context;
    imageButton = new ObservableField<>();
    setImageButton(R.mipmap.image_default); //set image default
}

public void onClickImageButton(View view) {
    setImageButton(R.mipmap.image_change); //change image
}

private void setImageButton(@DrawableRes int resId){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        imageButton.set(context.getDrawable(resId));
    }else{
        imageButton.set(context.getResources().getDrawable(resId));
    }
}
1
icaksama