web-dev-qa-db-ja.com

Androidバインディングアダプタが複数の引数を渡すとエラーが発生する

私はAndroid Data Binding。このチュートリアルに従っています: Data Binding Library 。複数のパラメーターを受け取るアダプターを実行しようとしています。これは私のコードです:

[〜#〜] xml [〜#〜]

   <ImageView
            Android:layout_width="@dimen/place_holder_size"
            Android:layout_height="@dimen/place_holder_size"
            Android:layout_alignParentRight="true"
            Android:layout_alignParentTop="true"
            Android:layout_centerVertical="true"
            app:url="@{image.imageUrl}"
            app:size="@{@dimen/place_holder_size}"
            />

バインドアダプタクラス

public class ViewBindingAdapters extends BaseObservable {

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
    if (!Strings.isNullOrEmpty(url)) {
        Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
    }
}
....


}

しかし、私はこのエラーを受け取っています:

Java.lang.RuntimeException:データバインディングエラーが見つかりました。 **** /データバインディングエラー**** msg:Android.widget.ImageViewでパラメータータイプJava.lang.Stringの属性 'app:url'のセッターが見つかりません。ファイル:... li_image_item.xml loc:30:27-30:40 **** \データバインディングエラー****

誰が理由を知っていますか??

前もって感謝します!

20
IrApp

問題は@dimen/place_holder_sizefloatとしてキャッチしている間にintを返します

BindingAdapterメソッドをこれに変更します

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

this を参照できます

32
Ravi Rupareliya

私が間違ったことは、関数内の引数の順序です。バインディングアダプタには複数の属性を追加できますが、メソッドで定義された同じシーケンスの引数と一致する必要があります

Kotlinのコードスニペット

@BindingAdapter(value = ["bind:brand", "bind:model", "bind:age"], requireAll = false)
@JvmStatic
fun bindProductDetails(linearLayout: LinearLayout, brand: String?, model: String?, age: String?) {
    if (brand != null && !brand.isEmpty()) {
        //code
        //code

    }
}
9

これを試して

 @BindingAdapter(value={"url", "size"}, requireAll=false)
 public static void loadImage(ImageView imageView, String url, int size) {
        if (!Strings.isNullOrEmpty(url)) {
            Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
        }
    }
4
Nas

更新

プレフィックスbind:を作成する必要はありません。これを使用するだけです。

@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

Xmlでは、app:などのプレフィックスを使用します

app:url="@{image.imageUrl}"
2
Khemraj