it-swarm.com.ru

Предупреждение адаптера привязки Android к пользовательскому привязыванию

Я следовал документации по привязке данных для Custom Binding Adapter для загрузки изображений с официального сайта разработчиков 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

41
asad.qazi

Я считаю, что пространство имен действительно игнорируется в аннотации BindingAdapter. Предупреждение появляется, если вы используете какой-либо префикс пространства имен, независимо от того, совпадает ли он с тем, который используется в вашем макете, или нет. Если вы опустите пространство имен, вот так:

@BindingAdapter({"imageUrl"})

... предупреждение не происходит.

Я подозреваю, что существует предупреждение, предупреждающее нас, что пространство имен удаляется до того, как строка используется в качестве ключа в реализации аннотации. Что имеет смысл, если вы считаете, что макеты свободны объявлять любые пространства имен, которые они хотят, например, app: или bind: или foo:, и аннотация должна работать во всех этих случаях.

77
Lorne Laliberte

Попробуй это, работай на меня! Я надеюсь это тебе поможет. Простой способ изменить ресурс изображения без привязки адаптера.

<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

На самом деле есть еще несколько учебных пособий, которые добавляют префикс к аннотации BindingAdapter

Используйте @BindingAdapter({"imageUrl"}) без префикса.

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

Pro Tip

Вы не получите предупреждение при использовании префикса 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.
}

Создать новый атрибут только тогда, когда вам это нужно.

0
Khemraj