Intereting Posts
Android – Фрагмент из библиотеки поддержки несовместим с платформой 4.3 GridLayout (а не GridView), как равномерно распределить всех детей Запись голоса только вызывающего абонента в андроид MediaPlayer в отдельном потоке против запуска службы через startForeground () Цвет рамки кнопки Android Android.view.ViewGroup $ LayoutParams нельзя отбрасывать в android.widget.AbsListView $ LayoutParams Подборка аудиофайла android Кинжал 2 Сохранение и восстановление состояния при остановке активности Android – Как эффективно загружать большое количество текста в TextView? Поддельное местоположение и скорость в эмуляторе. KML или GPX? Android.util.AndroidRuntimeException: requestFeature () необходимо вызвать перед добавлением содержимого Зачем использовать службу для фоновых задач? Импортировать com.google.android.gms.location.LocationServices, не удается обновить службы определения местоположения Как читать текстовый файл из каталога «assets» в виде строки? Платформы Android SDK между Linux и Windows

Установить идентификатор ресурса в android: src для ImageView с использованием привязки данных в Android

Я пытаюсь установить идентификатор ресурса ресурса для android: src ImageView с использованием привязки данных

Вот мой объект:

public class Recipe implements Parcelable { public final int imageResource; // resource ID (eg R.drawable.some_image) public final String title; // ... public Recipe(int imageResource, String title /* ... */) { this.imageResource = imageResource; this.title = title; } // ... } 

Вот мой макет:

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="recipe" type="com.example.android.fivewaystocookeggs.Recipe" /> </data> <!-- ... --> <ImageView android:id="@+id/recipe_image_view" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" android:src="@{recipe.imageResource}" /> <!-- ... --> </layout> 

И, наконец, класс активности:

 // ... public class RecipeActivity extends AppCompatActivity { public static final String RECIPE_PARCELABLE = "recipe_parcelable"; private Recipe mRecipe; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRecipe = getIntent().getParcelableExtra(RECIPE_PARCELABLE); ActivityRecipeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_recipe); binding.setRecipe(mRecipe); } // ... } 

Он вообще не отображает изображение. Что я делаю не так?

BTW, он отлично работал со стандартным способом:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recipe); final ImageView recipeImageView = (ImageView) findViewById(R.id.recipe_image_view); recipeImageView.setImageResource(mRecipe.imageResource); } 

Solutions Collecting From Web of "Установить идентификатор ресурса в android: src для ImageView с использованием привязки данных в Android"

Ответ от 10 ноября 2016 года

Комментарий Splash ниже показал, что нет необходимости использовать собственный тип свойства (например, imageResource ), мы можем вместо этого создать несколько методов для android:src :

 public class DataBindingAdatpers { @BindingAdapter("android:src") public static void setImageUri(ImageView view, String imageUri) { if (imageUri == null) { view.setImageURI(null); } else { view.setImageURI(Uri.parse(imageUri)); } } @BindingAdapter("android:src") public static void setImageUri(ImageView view, Uri imageUri) { view.setImageURI(imageUri); } @BindingAdapter("android:src") public static void setImageDrawable(ImageView view, Drawable drawable) { view.setImageDrawable(drawable); } @BindingAdapter("android:src") public static void setImageResource(ImageView imageView, int resource){ imageView.setImageResource(resource); } } 

Старый ответ

Вы всегда можете попробовать адаптер:

 public class DataBindingAdatpers { @BindingAdapter("imageResource") public static void setImageResource(ImageView imageView, int resource){ imageView.setImageResource(resource); } } 

Затем вы можете использовать адаптер в своем xml

 <ImageView android:id="@+id/recipe_image_view" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" imageResource="@{recipe.imageResource}" /> 

Обязательно обратите внимание, что имя внутри xml соответствует аннотации BindingAdapter (imageResource)

Класс DataBindingAdapters не должен быть объявлен нигде в частности, механика DataBinding найдет это неважно (я считаю)

определить:

 @BindingAdapter({"android:src"}) public static void setImageViewResource(ImageView imageView, int resource) { imageView.setImageResource(resource); } 

использовать:

 <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:scaleType="center" android:src="@{viewModel.imageRes, default=@drawable/guide_1}"/> 
 public Drawable getImageRes() { return mContext.getResources().getDrawable(R.drawable.icon); } <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="center" android:src="@{viewModel.imageRes}"/> 

Использование Fresco (библиотека изображений facebook)

  public class YourCustomBindingAdapters { //app:imageUrl="@{data.imgUri}" @BindingAdapter("bind:imageUrl") public static void loadImage(SimpleDraweeView imageView, String url) { if (url == null) { imageView.setImageURI(Uri.EMPTY); } else { if (url.length() == 0) imageView.setImageURI(Uri.EMPTY); else imageView.setImageURI(Uri.parse(url)); } } } 

Для Kotlin поместите это в файл utils верхнего уровня, не требуется статический / сопутствующий контекст:

 @BindingAdapter("android:src") fun setImageViewResource(view: ImageView, resId : Int) { view.setImageResource(resId) }