Usando setImageDrawable dinámicamente para establecer una imagen en un ImageView

120

Estoy generando una cadena desde la base de datos de forma dinámica que tiene el mismo nombre de imagen en la drawablecarpeta.

Ahora quiero establecer ese valor para ImageViewusarlo setImageDrawable(R.id.StringGenerated)dinámicamente.

Alguna sugerencia..

Arun
fuente
significa que está generando el ID de la imagen de forma dinámica, ¿verdad?
Paresh Mayani

Respuestas:

195

Prueba esto,

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

Esto devolverá la identificación del dibujable al que desea acceder ... luego puede configurar la imagen en la vista de imagen haciendo lo siguiente

imageview.setImageResource(id);
Rey RV
fuente
Muchas gracias ... lo encontré en otro lugar, pero aún así gracias por sus esfuerzos .. :)
Arun
12
Sin embargo, el uso de setImageResource () "hace lectura y decodificación de mapa de bits en el subproceso de la interfaz de usuario, lo que puede causar un problema de latencia ... considere usar setImageDrawable () o setImageBitmap ()". (Documentación de Android)
chetto
6
También puede obtener la identificación simplemente usando: 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);

o

setImageDrawable(getResources().getDrawable(R.drawable.icon));
NikhilReddy
fuente
Dijo que está generando una cadena desde la base de datos de forma dinámica con el mismo nombre de imagen.
Paresh Mayani
3
getDrawable (R.drawable.icon) está en desuso
Daryn
Para las personas que necesitan resolver getDrawable (R.drawable.icon) está en desuso, intente leer este enlace SO
Codingpan
77

Personalmente, prefiero usar el método setImageResource()así.

ImageView myImageView = (ImageView)findViewById(R.id.myImage);
myImageView.setImageResource(R.drawable.icon);
jlopez
fuente
1
este gana ya que es posible que desee cambiar la imagen desde cualquier lugar en su código donde no tenga contexto para llamar al método getResources () en él. por ejemplo, en adaptadores. No es necesario pasar el contexto a través del constructor solo para esta funcionalidad.
Phatee P
1
manera más limpia. No entiendo por qué esta no es la respuesta preferida.
Benjamin Basmaci
@BenjaminBasmaci Esto hace lectura y decodificación de mapas de bits en el hilo de la interfaz de usuario, lo que puede causar un problema de latencia. Si eso le preocupa, considere usar setImageDrawable (android.graphics.drawable.Drawable) o setImageBitmap (android.graphics.Bitmap) y BitmapFactory en su lugar. (De la documentación de Android)
Tayyab Mazhar
25

Los nombres de los recursos que se pueden dibujar no se almacenan como cadenas, por lo que tendrá que resolver la cadena en la constante entera generada durante la compilación. Puede usar la Resourcesclase para resolver la cadena en ese entero.

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

Esto resuelve su cadena generada en el número entero que ImageViewpuede usar para cargar la imagen correcta.

Alternativamente, puede usar la identificación para cargar Drawablemanualmente y luego configurar la imagen usando ese elemento de diseño en lugar de la identificación del recurso.

Drawable drawable = res.getDrawable( resourceId );
imageView.setImageDrawable( drawable );
Greyson
fuente
@Greyson ... Buen señor ... eso es lo que estoy buscando ... Muchas gracias ... :)
Arun
13

Tan simple como esta respuesta:

Drawable myDrawable = getResources().getDrawable(R.drawable.pic);
imageview.setImageDrawable(myDrawable);
Ahmad Arslan
fuente
8

Esto funciona, al menos en 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);

Puede usar setImageResource (), pero la documentación especifica que "lee y decodifica el mapa de bits en el subproceso de la interfaz de usuario, lo que puede causar un problema de latencia ... considere usar setImageDrawable () o setImageBitmap ()". como dijo chetto

resmall
fuente
7

Todas las respuestas publicadas no se aplican hoy. Por ejemplo, getDrawable () está en desuso. Aquí hay una respuesta actualizada, ¡salud!

ContextCompat.getDrawable(mContext, drawable)

De método documentado

public static final android.graphics.drawable.Drawable getDrawable (@NotNull android.content.Context context,
@ android.support.annotation.DrawableRes int id

constructor de carteras
fuente
Gracias por mencionar la parte obsoleta.
Karan Sharma
6

Puedes intentar usar este código:

ImageView ImgView = (ImageView)findViewById(R.id.ImgView);
ImgView.setImageResource(R.drawable.myicon);
Mersad Nilchy
fuente
4

Si no puede obtener un objeto Resources como este en una clase que no es una actividad, debe agregar el método getContext () para getResources () por ejemplo

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

imageView.setImageDrawable(getResources().getDrawable(R.drawable.my_drawable));

lxknvlk
fuente
2

También puedes usar algo como:

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

o usando Picasso:

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

ninjahoahong
fuente
0

Tuve el mismo problema que tú e hice lo siguiente para solucionarlo:

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

Construya una clase POJO.java y cree "métodos constructores, captadores y definidores"

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Luego configure los adaptadores a través de recursos de imagen dibujables en 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());
        }
    }

Luego pase las referencias a través de 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));

    }
}
Abdul Gaffar
fuente
-3

una pieza de mi proyecto, ¡todo funciona! )

@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());
Максим Багрянцев
fuente
Realmente debería agregar alguna explicación sobre por qué este código debería funcionar; también puede agregar comentarios en el código en sí; en su forma actual, no proporciona ninguna explicación que pueda ayudar al resto de la comunidad a comprender lo que hizo para resolver Respondo la pregunta.
ishmaelMakitla
-3

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

API 23 Android 6.0

Isaac
fuente
-4

El archivo 'R' no se puede generar en el tiempo de ejecución de la aplicación. Puede usar algunas otras alternativas, como usar if-elseoswitch-case

Vinod Maurya
fuente
Esto no parece relacionarse con la pregunta. Parece que está tratando de establecer una vista de imagen para un recurso ya existente, en lugar de intentar generar de Rnuevo
Greyson