Как получить источник ImageView, чтобы изменить его?

Я знаю, что изменение ресурса ImageView не имеет большого значения, просто используя myImageView.setImageResource(mynewImageDrawable)

но я хочу, чтобы проверить текущий ImageSource, прежде чем изменять его.

В основном, я хочу реализовать свои собственные радиокнопки с помощью imageViews. поэтому каждый раз, когда нажимается любое изображение, метод oncliked event изменяет ресурсы изображения моей группы.

и извините за моего бедного английского.

С уважением, Redsea

Ответ 1

Нет функции getDrawableId, поэтому вам нужно будет сделать что-то вроде набора тега для ImageView, когда вы измените его drawable. Например, установите идентификатор drawable как тег для ImageView, чтобы вы могли просто получить идентификатор drawable из тега.

Как это сделать?

Я бы сказал, что в 90% случаев ваши взгляды не будут иметь никакого тега, поэтому самый простой способ - считать ваш тег единственным тегом:

myImageView.setTag(R.drawable.currentImage);    //When you change the drawable
int drawableId = (Integer)myImageView.getTag(); //When you fetch the drawable id

Что делать, если у меня уже есть тег на моем представлении

В представлениях Android одновременно могут размещаться несколько тегов, если они имеют уникальный идентификатор. Вам нужно создать уникальный ресурс id и добавить его в качестве первого аргумента в вызов метода setTag. Оставляя код следующим образом:

myImageView.setTag(R.id.myTagId, R.drawable.currentImage); //Set
int drawableId = (Integer)myImageView.getTag(R.id.myTagId);

Ответ 2

Вы хотите сказать, что вы намерены проверить идентификатор ресурса, чтобы определить, выбран ли переключатель или нет? Хотя это, вероятно, может работать, это не очень хороший дизайн. Вообще говоря, вы хотите отделить модель от представления (иначе известную как парадокс Model-View-Controller). Для этого у вас может быть группа ваших переключателей, поддерживающая индекс для выбранного элемента, и каждый из ваших элементов хранится в списке. Когда элемент выбран, вы можете определить его индекс, обновить модель группы и затем обновить пользовательский интерфейс, чтобы отразить это изменение.

Не то, что вы предлагаете, не работает, это просто плохой дизайн и приводит к плохой ремонтопригодности (например, если имена ресурсов изменяются).

Ответ 3

Фактически после моей попытки, я нахожу, что есть способ получить источник imageView без необходимости использования свойства тега.

Integer src = attrs.getAttributeResourceValue(
                    "http://schemas.android.com/apk/res/android", "src", -1);

Первым параметром является пространство имен android и src - это имя свойства. Этот метод возвращает идентификатор ресурса изображения, если он найден или он вернет -1;

Ответ 5

Вы можете использовать это.

 private Drawable colocaImgen(String nombreFile) {
    Drawable res1 = null;
    String uri1 = null;
    try {
        //First image
        uri1 = "@drawable/" + nombreFile;
        int imageResource1 = getResources().getIdentifier(uri1, null,getApplicationContext().getPackageName());
        res1 = getResources().getDrawable(imageResource1);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        //int imageResource1 = context.getResources().getIdentifier(uri1, null, context.getApplicationContext().getPackageName());
        res1 = getResources().getDrawable(R.drawable.globo2);// Default image
    }
    return res1;
}

Тогда

((ImageView) findViewById(R.id.youNameFile)).setImageDrawable(colocaImgen("NameFile"));

Ответ 6

У меня была такая же проблема, и вот мои рабочие решения:

public void engLayoutExpand(View view) {
    ImageView iv = (ImageView) view;

    // One way:
    Bitmap bm1 = ((BitmapDrawable) iv.getDrawable()).getBitmap();
    Bitmap bm2 = ((BitmapDrawable) getResources().getDrawable(R.drawable.baseline_expand_less_black_36)).getBitmap();

    if (bm1 == bm2) {
        iv.setImageResource(R.drawable.baseline_expand_more_black_36);
    }

    // Other way
    Drawable.ConstantState cs1 = iv.getDrawable().getConstantState();
    Drawable.ConstantState cs2 = getResources().getDrawable(R.drawable.baseline_expand_less_black_36).getConstantState();

    if ( cs1 == cs2) {
        iv.setImageResource(R.drawable.baseline_expand_more_black_36);
    }

}