Utilisation de setImageDrawable dynamiquement pour définir l'image dans un ImageView


120

Je génère dynamiquement une chaîne de base de données qui porte le même nom d'image dans le drawabledossier.

Maintenant, je veux définir cette valeur pour une ImageViewutilisation setImageDrawable(R.id.StringGenerated)dynamique.

Aucune suggestion..


signifie que vous générez l'identifiant de l'image de manière dynamique, non?
Paresh Mayani

Réponses:


195

Essaye ça,

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

Cela renverra l'id du dessinable auquel vous souhaitez accéder ... alors vous pouvez définir l'image dans l'imageview en procédant comme suit

imageview.setImageResource(id);

Merci beaucoup .. je l'ai trouvé ailleurs bt encore merci pour vos efforts .. :)
Arun

12
Cependant, l'utilisation de setImageResource () "effectue la lecture et le décodage de Bitmap sur le thread d'interface utilisateur, ce qui peut provoquer un hoquet de latence ... envisagez d'utiliser setImageDrawable () ou setImageBitmap ()." (Documentation Android)
chetto

6
Vous pouvez également obtenir l'identifiant en utilisant simplement: 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);

ou

setImageDrawable(getResources().getDrawable(R.drawable.icon));

il a dit qu'il générait dynamiquement une chaîne de base de données avec le même nom d'image.
Paresh Mayani

3
getDrawable (R.drawable.icon) est obsolète
Daryn

Pour les personnes qui ont besoin de résoudre getDrawable (R.drawable.icon) est obsolète, essayez de lire ce lien SO
Codingpan

77

Personnellement, je préfère utiliser la méthode setImageResource()comme celle-ci.

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

1
celui-ci gagne puisque vous voudrez peut-être changer d'image à partir de n'importe quel endroit de votre code où vous n'avez pas de contexte pour appeler la méthode getResources () dessus. par exemple dans les adaptateurs. Pas besoin de passer le contexte à travers le constructeur uniquement pour cette fonctionnalité.
Phatee P

1
façon plus propre. Je ne comprends pas pourquoi ce n'est pas la réponse préférée.
Benjamin Basmaci

@BenjaminBasmaci Cela fait la lecture et le décodage Bitmap sur le thread de l'interface utilisateur, ce qui peut provoquer un hoquet de latence. Si c'est un problème, envisagez d'utiliser à la place setImageDrawable (android.graphics.drawable.Drawable) ou setImageBitmap (android.graphics.Bitmap) et BitmapFactory. (De la documentation Android)
Tayyab Mazhar

25

Les noms de ressources dessinables ne sont pas stockés sous forme de chaînes, vous devrez donc résoudre la chaîne dans la constante entière générée lors de la construction. Vous pouvez utiliser la Resourcesclasse pour résoudre la chaîne en cet entier.

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

Cela résout votre chaîne générée en un entier que le ImageViewpeut utiliser pour charger la bonne image.

Vous pouvez également utiliser l'ID pour charger Drawablemanuellement, puis définir l'image à l'aide de ce dessin au lieu de l'ID de ressource.

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

@Greyson ... Nice one monsieur..thatz ce que je recherche..Merci beaucoup .. :)
Arun

13

Aussi simple que cette réponse:

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

8

Cela fonctionne, au moins dans l'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);

Vous pouvez utiliser setImageResource (), mais la documentation spécifie que «effectue la lecture et le décodage de Bitmap sur le thread d'interface utilisateur, ce qui peut provoquer un hoquet de latence ... envisagez d'utiliser setImageDrawable () ou setImageBitmap ()». comme indiqué par chetto


7

Toutes les réponses publiées ne s'appliquent pas aujourd'hui. Par exemple, getDrawable () est obsolète. Voici une réponse mise à jour, bravo!

ContextCompat.getDrawable(mContext, drawable)

De la méthode documentée

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


Merci d'avoir mentionné la partie obsolète.
Karan Sharma

6

Vous pouvez essayer d'utiliser ce code:

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

4

Si vous ne pouvez pas obtenir un objet Resources comme celui-ci dans une classe qui n'est pas une activité, vous devez ajouter la méthode getContext () pour getResources () par exemple

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

Vous pouvez également utiliser quelque chose comme:

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

ou en utilisant Picasso:

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


0

J'ai eu le même problème que vous et j'ai fait ce qui suit pour le résoudre:

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

0

Construisez une classe POJO.java et créez des "méthodes constructeur, getter et setter"

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Ensuite, configurez les adaptateurs via des ressources dessinables d'image vers 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());
        }
    }

Passez ensuite les références via 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 morceau de mon projet, tout fonctionne! )

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

Vous devriez vraiment ajouter une explication sur la raison pour laquelle ce code devrait fonctionner - vous pouvez également ajouter des commentaires dans le code lui-même - dans sa forme actuelle, il ne fournit aucune explication qui puisse aider le reste de la communauté à comprendre ce que vous avez fait pour résoudre /répondre à la question.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

Le fichier «R» ne peut pas être généré au moment de l'exécution de l'application. Vous pouvez utiliser d'autres alternatives telles que l'utilisation if-elseouswitch-case


Cela ne semble pas lié à la question. Il semble qu'il essaie de définir une vue d'image sur une ressource déjà existante, plutôt que d'essayer de générer à Rnouveau
Greyson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.