ImageI में छवि सेट करने के लिए गतिशील रूप से setImageDrawable का उपयोग करना


120

मैं गतिशील रूप से डेटाबेस से एक स्ट्रिंग उत्पन्न कर रहा हूं जिसमें drawableफ़ोल्डर में छवि का समान नाम है ।

अब मैं गतिशील रूप से ImageViewउपयोग करने के लिए उस मूल्य को निर्धारित करना चाहता हूं setImageDrawable(R.id.StringGenerated)

कोई सुझाव..


इसका मतलब है कि आप छवि की आईडी गतिशील रूप से उत्पन्न कर रहे हैं, है ना?
परेश मेयानी

जवाबों:


195

इसे इस्तेमाल करे,

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

यह आपके द्वारा उपयोग किए जाने वाले ड्रॉएबल की आईडी को वापस कर देगा ... फिर आप निम्न को करके छवि को इमेजव्यू में सेट कर सकते हैं

imageview.setImageResource(id);

धन्यवाद एक टन..मैंने पाया कि यह कहीं और अभी भी आपके प्रयासों के लिए धन्यवाद है .. :)
अरुण

12
हालाँकि, setImageResource () का उपयोग करके "UI थ्रेड पर बिटमैप पढ़ना और डिकोड करना है, जो कि एक विलंब हिचकी का कारण बन सकता है ... setImageDrawable () या setImageBitmap () का उपयोग करने पर विचार करें।" (Android डॉक्यूमेंटेशन)
chetto

6
आप केवल आईडी का उपयोग करके भी प्राप्त कर सकते हैं: 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);

या

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

उन्होंने कहा कि वह डेटाबेस से गतिशील रूप से छवि के इसी नाम के साथ एक स्ट्रिंग पैदा कर रहा है।
परेश मेयानी

3
getDrawable (R.drawable.icon) को पदावनत कर दिया जाता है
Daryn

जिन लोगों को getDrawable (R.drawable.icon) को हल करने की आवश्यकता होती है, उन्हें पदावनत किया जाता है, इस SO लिंक
कोडिंगपेन

77

मैं व्यक्तिगत रूप से setImageResource()इस तरह की विधि का उपयोग करना पसंद करता हूं ।

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

1
यह एक जीत है क्योंकि आप अपने कोड में किसी भी जगह से छवि बदलना चाहते हैं, जहां आपको कॉल करने के लिए संदर्भ नहीं है। इस पर विधि () विधि। जैसे एडाप्टर्स में। सिर्फ इस फ़नसिटी के लिए कंस्ट्रक्टर के ज़रिए संदर्भ देने की ज़रूरत नहीं है।
Phatee P

1
साफ करने वाला। मुझे नहीं लगता कि यह पसंदीदा उत्तर क्यों नहीं है।
बेंजामिन बासमासी 14

@BenjaminBasmaci यह UI थ्रेड पर बिटमैप को पढ़ने और डिकोड करने का काम करता है, जो एक विलंबता हिचकी का कारण बन सकता है। यदि यह चिंता है, तो इसके बजाय setImageDrawable (android.graphics.drawable.Drawable) या setImageBitmap (android.graphics.Bitmap) और BitmapFactory का उपयोग करने पर विचार करें। (Android प्रलेखन से)
तैयब मजहर

25

संसाधन ड्रा करने योग्य नाम स्ट्रिंग के रूप में संग्रहीत नहीं किए जाते हैं, इसलिए आपको निर्माण के दौरान उत्पन्न पूर्णांक में स्ट्रिंग को हल करना होगा। आप Resourcesउस पूर्णांक में स्ट्रिंग को हल करने के लिए वर्ग का उपयोग कर सकते हैं ।

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

यह आपके उत्पन्न स्ट्रिंग को पूर्णांक में हल करता है ImageViewजो सही छवि को लोड करने के लिए उपयोग कर सकता है।

वैकल्पिक रूप से, आप Drawableमैन्युअल रूप से लोड करने के लिए आईडी का उपयोग कर सकते हैं और फिर संसाधन आईडी के बजाय उस ड्रॉबल का उपयोग करके छवि सेट कर सकते हैं ।

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

@Greyson ... अच्छा एक सर..तो क्या मैं देख रहा हूँ .. बहुत धन्यवाद .. :)
अरुण


8

यह काम करता है, कम से कम 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);

आप setImageResource () का उपयोग कर सकते हैं, लेकिन दस्तावेज़ निर्दिष्ट करता है कि "UI थ्रेड पर बिटमैप पढ़ना और डिकोड करना है, जो कि विलंबता हिचकी का कारण बन सकता है ... setImageDrawable () या setImageBitmap () का उपयोग करने पर विचार करें।" जैसा कि चेट्टो ने कहा है


7

पोस्ट किए गए सभी उत्तर आज लागू नहीं होते हैं। उदाहरण के लिए, getDrawable () पदावनत है। यहाँ एक अद्यतन जवाब है, चीयर्स!

ContextCompat.getDrawable(mContext, drawable)

प्रलेखित विधि से

सार्वजनिक स्थैतिक अंतिम android.graphics.drawable.rawable getDrawable (@NotNull android.content.Context संदर्भ,
@ android.support.annotation.DrawableRes int आईडी


पदावनत भाग का उल्लेख करने के लिए धन्यवाद।
करण शर्मा

6

आप इस कोड का उपयोग करने का प्रयास कर सकते हैं:

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

4

यदि आपको इस तरह की संसाधन वस्तु नहीं मिल सकती है, जो एक गतिविधि नहीं है, तो आपको getContext () मेथड के लिए getResources () उदाहरण के लिए जोड़ना होगा

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


2

आप कुछ का उपयोग भी कर सकते हैं जैसे:

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

या पिकासो का उपयोग कर:

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


0

मुझे आपके समान समस्या थी और मैंने इसे हल करने के लिए निम्न कार्य किए:

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

0

एक POJO.java वर्ग का निर्माण करें और "कंस्ट्रक्टर, गेट्टर और सेटर विधियां" बनाएं

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

फिर 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());
        }
    }

फिर गतिविधिक्लास.जवा के माध्यम से संदर्भों को पास करें

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

मेरी परियोजना का एक टुकड़ा, सब कुछ काम करता है! )

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

आपको वास्तव में कुछ स्पष्टीकरण जोड़ना चाहिए कि यह कोड क्यों काम करना चाहिए - आप स्वयं कोड में टिप्पणी भी जोड़ सकते हैं - अपने वर्तमान रूप में, यह कोई स्पष्टीकरण नहीं देता है जो बाकी समुदाय को समझने में मदद कर सकता है कि आपने क्या हल किया था /प्रश्न का उत्तर दो।
ishmelMakitla

-3

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

एपीआई 23 एंड्रॉइड 6.0


-4

ऐप के रन टाइम पर 'R' फाइल जेनरेट नहीं की जा सकती है। आप कुछ अन्य विकल्पों का उपयोग कर सकते हैं जैसे कि उपयोग करना if-elseयाswitch-case


यह प्रश्न से संबंधित नहीं लगता है। ऐसा लगता है जैसे कि वह पहले से मौजूद किसी संसाधन के लिए एक imageView स्थापित करने के लिए, बल्कि उत्पन्न करने के लिए कोशिश कर रहा से कोशिश कर रहा है Rफिर से
Greyson
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.