69

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

After successfully compiling the code I get a warning which is:

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

My Code is as follow:

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

Why this warning is generated?

A screenshot is also attached...enter image description here

4

3 回答 3

119

BindingAdapter我相信名称空间在注释中确实被忽略了。如果您使用任何命名空间前缀,无论它是否与您的布局中使用的前缀匹配,都会出现警告。如果省略命名空间,如下所示:

@BindingAdapter({"imageUrl"})

...警告没有发生。

我怀疑存在警告以提醒我们在将字符串用作注释实现中的键之前,名称空间已被剥离。当您考虑布局可以自由声明他们想要的任何名称空间时,这是有道理的,例如app:or bind:or foo:,并且注释需要在所有这些情况下工作。

于 2016-03-04T19:37:56.990 回答
11

实际上仍然有一些教程在BindingAdapter注释中添加了前缀。

@BindingAdapter({"imageUrl"})不带任何前缀使用。

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

专家提示

android:在中使用前缀时不会收到警告BindingAdapter。因为那是鼓励的。我会建议使用@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.
}

仅在需要时创建新属性。

于 2018-08-01T17:15:38.157 回答
1

试试这个,为我工作!我希望这可以帮助你。无需绑定适配器即可更改图像资源的简单方法。

<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));
    }
}
于 2016-06-09T08:19:17.033 回答