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..


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

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

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

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

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


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


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

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

3

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


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


0

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

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

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

    }
}

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

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


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.