Використовуючи setImageDrawable динамічно для встановлення зображення в ImageView


120

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

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

Будь-які пропозиції..


значить, ви динамічно генеруєте ідентифікатор зображення, правда?
Paresh Mayani

Відповіді:


195

Спробуйте це,

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

Це поверне ідентифікатор, який можна отримати, до якого ви хочете отримати доступ ... тоді ви можете встановити зображення в перегляді зображень, виконавши наступне

imageview.setImageResource(id);

Дякую тоні .. Я знайшов це десь ще, але все ж дякую за ваші зусилля .. :)
Арун

12
Однак, використовуючи setImageResource (), "читання Bitmap та декодування на потоці користувальницького інтерфейсу може читати та декодувати, що може спричинити іконку затримки ... Подумайте про використання setImageDravable () або setImageBitmap ()." (Документація на Android)
чет

6
Ви також можете отримати ідентифікатор, просто скориставшись: R.dravable.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));

він сказав, що динамічно генерує рядок із бази даних з однойменним зображенням.
Paresh Mayani

3
getDrawable (R.dravable.icon) застарілий
Дарин

Для людей, яким потрібно вирішити проблему getDravable (R.dravable.icon) застаріло, спробуйте прочитати це посилання SO
Codingpan

77

Я особисто вважаю за краще використовувати такий метод setImageResource().

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

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

1
спосіб очищення. Я не розумію, чому це не найкраща відповідь.
Бенджамін Басмачі

@BenjaminBasmaci Це робить зчитування та декодування Bitmap на потоці інтерфейсу користувача, що може спричинити затримку ікони. Якщо це викликає занепокоєння, розгляньте замість цього використання setImageDravable (android.graphics.dravable.Dravable) або setImageBitmap (android.graphics.Bitmap) та BitmapFactory. (З Документації на Android)
Tayyab Mazhar

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 ... Приємний один сер..ха, що я шукаю .. Дякую багато .. :)
Арун

13

Настільки ж просто, як ця відповідь:

Drawable myDrawable = getResources().getDrawable(R.drawable.pic);
imageview.setImageDrawable(myDrawable);

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 в потоці інтерфейсу користувача може спричинити затримку затримки ... розглянути можливість використання setImageDravable () або setImageBitmap ()." як стверджує четто


7

Усі опубліковані відповіді сьогодні не застосовуються. Наприклад, застаріле значення getDravable () застаріле. Ось оновлена ​​відповідь, ура!

ContextCompat.getDrawable(mContext, drawable)

З документально підтвердженого методу

загальнодоступний статичний кінцевий android.graphics.dravable.Drawable getDravable (контекст @NotNull android.content.Context,
@ android.support.annotation.DravableRes int id


Дякуємо, що згадали про застарілу частину.
Каран Шарма

6

Ви можете спробувати використовувати цей код:

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

4

Якщо ви не можете отримати подібний об’єкт Resources у класі, який не є діяльністю, вам слід додати метод 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 та створіть "конструктор, методи getter та setter"

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

-3

btnImg.SetImageDravable (GetDravable (Resource.Dravable.button_round_green));

API 23 Android 6.0


-4

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


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