2011-12-27 3 views
84

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

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

Все предложения ..

+0

означает, что вы генерируете идентификатор изображения динамически, не так ли? –

ответ

151

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

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

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

imageview.setImageResource(id); 
+0

Спасибо, тонна .. я нашел его где-то еще, но все еще благодарен за ваши усилия .. :) – Arun

+11

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

+4

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

74
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)); 
+0

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

+0

sry i was miss понял вопрос .. –

+3

getDrawable (R.drawable.icon) устарел – Daryn

-4

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

+0

Еще раз. Еще один пользователь. –

+0

Это не похоже на вопрос. Кажется, он пытается установить образ на уже существующий ресурс, вместо того, чтобы пытаться генерировать 'R' снова – Greyson

+0

@paresh u получил точку Бадди, где это решение .. ?? – Arun

20

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

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

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

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

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

@Greyson ... Nice one sir..thatz, что я ищу .. Спасибо большое .. :) – Arun

+0

Нет такой ошибки в файле или каталоге? вы можете помочь –

7

Это работает, по крайней мере, в API Android 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(), но в документации указывается, что «делает растровое чтение и декодирование в потоке пользовательского интерфейса, что может вызвать задержку икры ... рассмотрите возможность использования setImageDrawable() или setImageBitmap()». как заявил Четто

0

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

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

Как просто, как этот ответ:

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

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

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

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

+1

Лучший, спасибо! – luiswill

3

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

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

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

@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()); 
+0

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

1

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

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

или с помощью Пикассо:

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

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)); 

    } 
} 
1

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

ContextCompat.getDrawable(mContext, drawable) 

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

общественности статической окончательный android.graphics.drawable.Drawable getDrawable (@NotNull android.content.Context контекст,
@ android.support.annotation.DrawableRes INT идентификатор

-1

btnImg.SetImageDrawable (GetDrawable (Resource.Drawable.button_round_green));

API 23 Android 6.0

Смежные вопросы