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

Arun
la source
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);
Roi RV
la source
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));
NikhilReddy
la source
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);
jlopez
la source
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
la source
@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);
Ahmad Arslan
la source
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

resmall
la source
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

portfoliobuilder
la source
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);
Mersad Nilchy
la source
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);
Vladimir Salguero
la source
3

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

lxknvlk
la source
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);

ninjahoahong
la source
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()));
JCDecary
la source
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));

    }
}
Abdul Gaffar
la source
-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());
Максим Багрянцев
la source
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

Isaac
la source
-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

Vinod Maurya
la source
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