Динамическое использование setImageDrawable для установки изображения в ImageView


120

Я динамически генерирую строку из базы данных, которая имеет то же имя изображения в drawableпапке.

Теперь я хочу установить это значение для динамического ImageViewиспользования setImageDrawable(R.id.StringGenerated).

Какие-либо предложения..


означает, что вы генерируете идентификатор изображения динамически, верно?
Пареш Майани

Ответы:


195

Попробуй это,

int id = getResources().getIdentifier("yourpackagename:drawable/" + StringGenerated, null, null);

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

imageview.setImageResource(id);

Большое спасибо .. Я нашел это где-то еще, но все же спасибо за ваши усилия .. :)
Arun

12
Однако использование setImageResource () «выполняет чтение и декодирование Bitmap в потоке пользовательского интерфейса, что может вызвать задержку задержки ... рассмотрите возможность использования setImageDrawable () или setImageBitmap ()». (Документация для Android)
четто

6
Вы также можете получить идентификатор, просто используя: R.drawable.filemane
Artur

102
Drawable image = ImageOperations(context,ed.toString(),"image.jpg");
            ImageView imgView = new ImageView(context);
            imgView = (ImageView)findViewById(R.id.image1);
            imgView.setImageDrawable(image);

или

setImageDrawable(getResources().getDrawable(R.drawable.icon));

он сказал, что динамически генерирует строку из базы данных с тем же именем изображения.
Пареш Майани

3
getDrawable (R.drawable.icon) устарел
Дарин

Для людей, которым необходимо разрешить getDrawable (R.drawable.icon), устарел, попробуйте прочитать эту ссылку SO
Codingpan

77

Лично я предпочитаю использовать такой метод setImageResource().

ImageView myImageView = (ImageView)findViewById(R.id.myImage);
myImageView.setImageResource(R.drawable.icon);

1
этот выигрывает, поскольку вы можете захотеть изменить изображение из любого места в вашем коде, где у вас нет контекста для вызова на нем метода getResources (). например, в Адаптерах. Не нужно передавать контекст через конструктор только для этой функциональности.
Phatee P,

1
путь чище. Я не понимаю, почему это не лучший ответ.
Бенджамин Басмачи

@BenjaminBasmaci Это выполняет чтение и декодирование растрового изображения в потоке пользовательского интерфейса, что может вызвать сбой задержки. Если это вызывает беспокойство, рассмотрите возможность использования вместо них setImageDrawable (android.graphics.drawable.Drawable) или setImageBitmap (android.graphics.Bitmap) и BitmapFactory. (Из документации Android)
Тайяб Мажар,

25

Имена ресурсов, доступных для рисования, не хранятся в виде строк, поэтому вам придется преобразовать строку в целочисленную константу, сгенерированную во время сборки. Вы можете использовать Resourcesкласс для преобразования строки в это целое число.

Resources res = getResources();
int resourceId = res.getIdentifier(
   generatedString, "drawable", getPackageName() );
imageView.setImageResource( resourceId );

Это преобразует вашу сгенерированную строку в целое число, которое ImageViewможет использовать для загрузки правильного изображения.

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

Drawable drawable = res.getDrawable( resourceId );
imageView.setImageDrawable( drawable );

@Greyson ... Хороший сэр ... вот что я ищу ... Большое спасибо ... :)
Arun


8

Это работает, по крайней мере, в Android API 15

ImageView = imgv;
Resources res = getResources(); // need this to fetch the drawable
Drawable draw = res.getDrawable( R.drawable.image_name_in_drawable );
imgv.setImageDrawable(draw);

Вы можете использовать setImageResource (), но в документации указано, что «выполняет чтение и декодирование Bitmap в потоке пользовательского интерфейса, что может вызвать сбой задержки ... рассмотрите возможность использования setImageDrawable () или setImageBitmap ()». как заявлено Четто


7

Все опубликованные ответы сегодня не применимы. Например, getDrawable () устарела. Вот обновленный ответ, ура!

ContextCompat.getDrawable(mContext, drawable)

Из документированного метода

общедоступный статический финал android.graphics.drawable.Drawable getDrawable (@NotNull android.content.Context context,
@ android.support.annotation.DrawableRes int id


Спасибо, что упомянули устаревшую часть.
Каран Шарма

6

Вы можете попробовать использовать этот код:

ImageView ImgView = (ImageView)findViewById(R.id.ImgView);
ImgView.setImageResource(R.drawable.myicon);

4

Если вы не можете получить такой объект ресурсов в классе, который не является Activity, вам необходимо добавить метод getContext () для getResources (), например

ImageView image = (ImageView) v.findViewById(R.id.item_image);
int id = getContext().getResources().getIdentifier(imageName, "drawable", getContext().getPackageName());
image.setImageResource(id);


2

Вы также можете использовать что-то вроде:

imageView.setImageDrawable(ActivityCompat.getDrawable(getContext(), R.drawable.generatedID));

или используя Пикассо:

Picasso.with(getContext()).load(R.drawable.generatedId).into(imageView);


0

У меня была та же проблема, что и у вас, и я сделал следующее, чтобы ее решить:

**IMAGEVIEW**.setImageResource(getActivity()
             .getResources()
             .getIdentifier("**IMG**", "drawable", getActivity()
             .getPackageName()));

0

Создайте класс POJO.java и создайте «методы конструктора, получения и установки»

class POJO{
        public POJO(Drawable proImagePath) {
                setProductImagePath(proImagePath);
        }

        public Drawable getProductImagePath() {
                return productImagePath;
        }

        public void setProductImagePath(Drawable productImagePath) {
                this.productImagePath = productImagePath;
        }
}

Затем настройте адаптеры через ресурсы для рисования изображений в CustomAdapter.java.

    class CustomAdapter extends ArrayAdapter<POJO>{

       private ArrayList<POJO> cartList = new ArrayList<POJO>();
       public MyCartAdapter(Context context, int resource) {
          super(context, resource);
       }

       public MyCartAdapter(Context context, ArrayList<POJO> cartList) {
          super(context, 0, cartList);
          this.context = context;
          this.cartList = cartList;

       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          /*
          *Here you can setup your layout and references.
          **/
          ImageView productImage = (ImageView) rootView.findViewById(R.id.cart_pro_image);
          productImage.setImageDrawable(POJO.getProductImagePath());
        }
    }

Затем передайте ссылки через ActivityClass.java

public class MyCartActivity extends AppCompatActivity{
       POJO pojo;
       CustomAdapter customAdapter;
       ArrayList<POJO> cartList = new ArrayList<POJO>();

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.your_layout);

          customAdapter = new CustomAdapter(this, cartList);

          pojo = new POJO(getResources().getDrawable(R.drawable.help_green));

    }
}

-3

кусок моего проекта, все работает! )

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ModelSystemTraining modelSystemTraining = items.get(position);

int icon = context.getResources().getIdentifier(String.valueOf(modelSystemTraining.getItemIcon()), "drawable", context.getPackageName());

        final FragmentViewHolderSystem fragmentViewHolderSystem = (FragmentViewHolderSystem) holder;
        final View itemView = fragmentViewHolderSystem.itemView;
//                Set Icon
fragmentViewHolderSystem.trainingIconImage.setImageResource(icon);
//                Set Title
fragmentViewHolderSystem.title.setText(modelSystemTraining.getItemTitle());
//                Set Desc
fragmentViewHolderSystem.description.setText(modelSystemTraining.getItemDescription());

Вам действительно следует добавить некоторые пояснения, почему этот код должен работать - вы также можете добавлять комментарии в сам код - в его текущей форме он не предоставляет никаких объяснений, которые могли бы помочь остальной части сообщества понять, что вы сделали для решения /ответить на вопрос.
ishmaelMakitla


-4

Файл "R" не может быть создан во время выполнения приложения. Вы можете использовать другие альтернативы, такие как использование if-elseилиswitch-case


Кажется, это не имеет отношения к вопросу. Кажется, что он пытается установить просмотр изображения для уже существующего ресурса, а не пытается создать его Rснова
Грейсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.