Utilizzando setImageDrawable dinamicamente per impostare l'immagine in un ImageView


120

Sto generando dinamicamente una stringa dal database che ha lo stesso nome dell'immagine nella drawablecartella.

Ora voglio impostare quel valore per l' ImageViewutilizzo setImageDrawable(R.id.StringGenerated)dinamico.

Eventuali suggerimenti..


significa che stai generando l'ID dell'immagine in modo dinamico, giusto?
Paresh Mayani

Risposte:


195

Prova questo,

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

Questo restituirà l'id del disegnabile a cui vuoi accedere ... quindi puoi impostare l'immagine nella visualizzazione immagine procedendo come segue

imageview.setImageResource(id);

Grazie mille .. l'ho trovato da qualche altra parte ma grazie ancora per i tuoi sforzi .. :)
Arun

12
Tuttavia, l'utilizzo di setImageResource () "esegue la lettura e la decodifica bitmap sul thread dell'interfaccia utente, che può causare un singhiozzo di latenza ... considera l'utilizzo di setImageDrawable () o setImageBitmap ()." (Documentazione Android)
chetto

6
Puoi anche ottenere l'id semplicemente 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));

ha detto che sta generando dinamicamente una stringa dal database con lo stesso nome dell'immagine.
Paresh Mayani

3
getDrawable (R.drawable.icon) è deprecato
Daryn,

Per le persone che hanno bisogno di risolvere getDrawable (R.drawable.icon) è deprecato, prova a leggere questo link SO
Codingpan

77

Personalmente preferisco usare il metodo in setImageResource()questo modo.

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

1
questo vince poiché potresti voler cambiare l'immagine da qualsiasi punto del tuo codice in cui non hai il contesto per chiamare il metodo getResources () su di esso. ad esempio negli adattatori. Non c'è bisogno di passare il contesto attraverso il costruttore solo per questa funzionalità.
Phatee P

1
modo più pulito. Non capisco perché questa non sia la risposta preferita.
Benjamin Basmaci

@BenjaminBasmaci Questo esegue la lettura e la decodifica bitmap sul thread dell'interfaccia utente, che può causare un singhiozzo di latenza. Se questo è un problema, prendi in considerazione l'utilizzo di setImageDrawable (android.graphics.drawable.Drawable) o setImageBitmap (android.graphics.Bitmap) e BitmapFactory invece. (Dalla documentazione di Android)
Tayyab Mazhar

25

I nomi disegnabili delle risorse non vengono memorizzati come stringhe, quindi dovrai risolvere la stringa nella costante intera generata durante la compilazione. Puoi usare la Resourcesclasse per risolvere la stringa in quel numero intero.

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

Questo risolve la stringa generata nel numero intero che ImageViewpuò utilizzare per caricare l'immagine giusta.

In alternativa, puoi utilizzare l'ID per caricare Drawablemanualmente e quindi impostare l'immagine utilizzando quel disegnabile invece dell'ID risorsa.

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

@ Greyson ... Simpatico signore..questo è quello che sto cercando..Grazie mille .. :)
Arun

13

Semplice come questa risposta:

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

8

Funziona, almeno nell'API 15 di Android

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

È possibile utilizzare setImageResource (), ma la documentazione specifica che "legge e decodifica Bitmap sul thread dell'interfaccia utente, il che può causare un singhiozzo di latenza ... considera l'utilizzo di setImageDrawable () o setImageBitmap ()." come affermato da chetto


7

Tutte le risposte pubblicate non si applicano oggi. Ad esempio, getDrawable () è deprecato. Ecco una risposta aggiornata, saluti!

ContextCompat.getDrawable(mContext, drawable)

Dal metodo documentato

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


Grazie per aver menzionato la parte deprecata.
Karan Sharma,

6

Puoi provare a usare questo codice:

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

4

Se non puoi ottenere un oggetto Resources come questo in una classe che non è un'attività, devi aggiungere il metodo getContext () per getResources () per esempio

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

Puoi anche usare qualcosa come:

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

o usando Picasso:

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


0

Ho avuto lo stesso problema di te e ho fatto quanto segue per risolverlo:

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

0

Costruisci una classe POJO.java e crea "metodi di costruzione, getter e setter"

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Quindi configurare gli adattatori tramite le risorse disegnabili di immagini su 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());
        }
    }

Quindi passare i riferimenti tramite 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

un pezzo del mio progetto, funziona tutto! )

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

Dovresti davvero aggiungere qualche spiegazione sul motivo per cui questo codice dovrebbe funzionare - puoi anche aggiungere commenti nel codice stesso - nella sua forma attuale, non fornisce alcuna spiegazione che possa aiutare il resto della comunità a capire cosa hai fatto per risolvere /rispondi alla domanda.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

Il file "R" non può essere generato in fase di esecuzione dell'app. È possibile utilizzare altre alternative come l'utilizzo di if-elseoswitch-case


Questo non sembra essere correlato alla domanda. Sembra che stia cercando di impostare una visualizzazione dell'immagine su una risorsa già esistente, piuttosto che provare a generarla di Rnuovo
Greyson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.