Подтвердить что ты не робот

Получить идентификатор drawable в ImageView

У меня есть один ImageView и установите для него нарисованный. Теперь мне нужно получить идентификатор drawable on click event ImageView динамически. Как я могу получить его?

imgtopcolor = (ImageView) findViewById(R.id.topcolor); 
imgtopcolor.setImageResource(R.drawable.dr);  // How do I get this back?

Теперь при событии касания imgtopcolor мне нужен идентификатор с возможностью рисования, потому что я каждый раз настраиваю разные вытягиваемые и хочу сравнить выталкиваемый с другими

4b9b3361

Ответ 1

Я думаю, что если я правильно понимаю, это то, что вы делаете.

ImageView view = (ImageView) findViewById(R.id.someImage);
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        ImageView imageView = (ImageView) view;
        assert(R.id.someImage == imageView.getId());

        switch(getDrawableId(imageView)) {
            case R.drawable.foo:
                imageView.setDrawableResource(R.drawable.bar);
                break;
            case R.drawable.bar:
            default:
                imageView.setDrawableResource(R.drawable.foo);
            break;
        }
    });

Правильно? Так что функция getDrawableId() не существует. Вы не можете получить идентификатор, из которого был создан экземпляр drawable, поскольку идентификатор - это просто ссылка на местоположение данных на устройстве о том, как создать drawable. После создания drawable у него нет способа вернуть ресурсId, который использовался для его создания. Но вы можете заставить его работать что-то вроде этого, используя теги

ImageView view = (ImageView) findViewById(R.id.someImage);
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        ImageView imageView = (ImageView) view;
        assert(R.id.someImage == imageView.getId());

        // See here
        Integer integer = (Integer) imageView.getTag();
        integer = integer == null ? 0 : integer;

        switch(integer) {
        case R.drawable.foo:
            imageView.setDrawableResource(R.drawable.bar);
            imageView.setTag(R.drawable.bar);
            break;
        case R.drawable.bar:
        default:
            imageView.setDrawableResource(R.drawable.foo);
            imageView.setTag(R.drawable.foo);
            break;
        }
    });

Ответ 2

Я ответил на что-то подобное в другом вопросе, но немного изменил бы это для этого.

К сожалению, нет getImageResource() или getDrawableId(). Но я создал простой способ обхода путем использования тегов ImageView.

В onCreate():

imageView0 = (ImageView) findViewById(R.id.imageView0);
imageView1 = (ImageView) findViewById(R.id.imageView1);
imageView2 = (ImageView) findViewById(R.id.imageView2);

imageView0.setTag(R.drawable.apple);
imageView1.setTag(R.drawable.banana);
imageView2.setTag(R.drawable.cereal);

Затем, если хотите, вы можете создать простую функцию для получения идентификатора drawable:

private int getDrawableId(ImageView iv) {
    return (Integer) iv.getTag();
}

Слишком просто.

Ответ 3

На сегодняшний день поддержка этой функции отсутствует. Тем не менее, я нашел немного взлома на этом.

 imageView.setImageResource(R.drawable.ic_star_black_48dp);
 imageView.setTag(R.drawable.ic_star_black_48dp);

Итак, если вы хотите получить идентификатор представления, просто получите его тег.

if (imageView.getTag() != null) {
   int resourceID = (int) imageView.getTag();

   //
   // drawable id.
   //   
}

Ответ 4

Простое решение может состоять в том, чтобы просто сохранить возвращаемый идентификатор во временной переменной. Я не уверен, насколько это практично для вашей ситуации, но это определенно быстрое решение.

Ответ 5

Еще проще: просто сохраните идентификатор R.drawable в идентификаторе вида: используйте v.setId(). Затем верните его с помощью v.getId().