自定义绑定适配器警告

我从官方的 Android 开发者站点查看了 自定义绑定适配器 for 图像加载的数据绑定文档: 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

24626 次浏览

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

@BindingAdapter({"imageUrl"})

警告不会发生。

我怀疑这个警告的存在是为了提醒我们,在将字符串用作注释实现中的键之前,名称空间被去掉了。当您考虑到布局可以自由地声明它们想要的任何名称空间,例如 app:bind:foo:,并且注释需要在所有这些情况下工作时,这是有意义的。

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

<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));
}
}

实际上还有一些教程在 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.
}

只有在需要时才创建新属性。