Android DataBinding自定义绑定适配器警告

时间:2016-02-10 11:05:57

标签: android android-layout android-studio android-databinding

我从官方Android开发者网站上关注自定义绑定适配器的数据绑定文档,以获取图片加载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

3 个答案:

答案 0 :(得分:84)

我相信在BindingAdapter注释中真正忽略了命名空间。如果使用任何名称空间前缀,则会发出警告,无论它是否与布局中使用的名称前缀匹配。如果省略命名空间,请执行以下操作:

@BindingAdapter({"imageUrl"})

......警告不会发生。

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

答案 1 :(得分: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));
    }
}

答案 2 :(得分:1)

实际上,仍然有一些教程在* STRING and NUMBER are mutually exclusive, except for the special * case of an uninitialized value, represented internally by * Nnull_string. They represent the type of a value as assigned. * Nnull_string has both STRING and NUMBER attributes, but all other * scalar values should have precisely one of these bits set. * * STRCUR and NUMCUR are not mutually exclusive. They represent that * the particular type of value is up to date. For example, * * a = 5 # NUMBER | NUMCUR * b = a "" # Adds STRCUR to a, since a string value * # is now available. But the type hasn't changed! * * a = "42" # STRING | STRCUR * b = a + 0 # Adds NUMCUR to a, since numeric value * # is now available. But the type hasn't changed! 注释中添加前缀。

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

仅在需要时创建新属性。