Bir ImageView'da görüntüyü ayarlamak için setImageDrawable'ı dinamik olarak kullanma


120

Veritabanından dinamik olarak drawableklasörde aynı görüntü adına sahip bir dize oluşturuyorum .

Şimdi bu değeri dinamik olarak ImageViewkullanmak için ayarlamak istiyorum setImageDrawable(R.id.StringGenerated).

Baska öneri..


dinamik olarak görüntünün kimliğini oluşturduğunuz anlamına gelir, değil mi?
Paresh Mayani

Yanıtlar:


195

Bunu dene,

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

Bu, erişmek istediğiniz çekilebilir dosyanın kimliğini döndürecektir ... ardından aşağıdakileri yaparak görüntü görünümünde görüntüyü ayarlayabilirsiniz.

imageview.setImageResource(id);

Çok teşekkürler .. Başka bir yerde buldum ama yine de Çabalarınız için teşekkürler .. :)
Arun

12
Ancak setImageResource () kullanıldığında "UI iş parçacığında Bitmap okuma ve kod çözme yapar, bu da bir gecikme hıçkırmasına neden olabilir ... setImageDrawable () veya setImageBitmap () kullanmayı düşünün." (Android belgeleri)
chetto

6
Kimliği kullanarak da elde edebilirsiniz: 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);

veya

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

Veritabanından dinamik olarak aynı görüntü adıyla bir dizi oluşturduğunu söyledi.
Paresh Mayani

3
getDrawable (R.drawable.icon) kullanımdan kaldırıldı
Daryn

GetDrawable (R.drawable.icon) çözümünün kaldırılması gereken kişiler için bu SO bağlantısını
Codingpan

77

Ben şahsen bu yöntemi kullanmayı tercih ediyorum setImageResource().

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

1
kodunuzda getResources () yöntemini çağırmak için bağlamınızın olmadığı herhangi bir yerden görüntüyü değiştirmek isteyebileceğinizden bu kazanır. örneğin Adaptörlerde. Sadece bu işlevsellik için bağlamı yapıcıdan geçirmeye gerek yok.
Phatee P

1
yol temizleyici. Bunun neden tercih edilen cevap olmadığını anlamıyorum.
Benjamin Basmaci

@BenjaminBasmaci Bu, UI iş parçacığında Bitmap okuma ve kod çözme yapar, bu da gecikme hıçkırmasına neden olabilir. Bu bir sorunsa, bunun yerine setImageDrawable (android.graphics.drawable.Drawable) veya setImageBitmap (android.graphics.Bitmap) ve BitmapFactory kullanmayı düşünün. (Android Belgelerinden)
Tayyab Mazhar

25

Çekilebilir kaynak adları dizeler olarak depolanmaz, bu nedenle dizeyi derleme sırasında oluşturulan tamsayı sabitine çözümlemeniz gerekir. ResourcesDizeyi bu tam sayıya çözümlemek için sınıfı kullanabilirsiniz .

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

Bu, oluşturduğunuz dizeyi ImageViewdoğru görüntüyü yüklemek için kullanabileceğiniz tam sayıya dönüştürür .

Alternatif olarak, kimliği Drawablemanuel olarak yüklemek için kullanabilir ve ardından görüntüyü kaynak kimliği yerine bu çekilebilirliği kullanarak ayarlayabilirsiniz.

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

@Greyson ... Güzel bir efendim..bu aradığım şey..Teşekkürler .. :)
Arun

13

Bu cevap kadar basit:

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

8

Bu, en azından Android API 15'te çalışır

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 () kullanabilirsiniz, ancak dokümantasyon "UI iş parçacığında Bitmap okuma ve kod çözme yapar, bu da bir gecikme hıçkırığına neden olabilir ... setImageDrawable () veya setImageBitmap () kullanmayı düşünün." chetto tarafından belirtildiği gibi


7

Gönderilen tüm cevaplar bugün geçerli değildir. Örneğin, getDrawable () kullanımdan kaldırılmıştır. İşte güncellenmiş bir cevap, şerefe!

ContextCompat.getDrawable(mContext, drawable)

Belgelenen yöntemden

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


Kullanımdan kaldırılan kısımdan bahsettiğiniz için teşekkür ederiz.
Karan Sharma

6

Bu kodu kullanmayı deneyebilirsiniz:

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

4

Activity olmayan bir sınıfta bunun gibi Resources nesnesini alamazsanız, örneğin getResources () için getContext () yöntemini eklemeniz gerekir.

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

Ayrıca aşağıdaki gibi bir şey de kullanabilirsiniz:

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

veya Picasso kullanarak:

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


0

Seninle aynı sorunu yaşadım ve çözmek için aşağıdakileri yaptım:

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

0

Bir POJO.java sınıfı oluşturun ve "yapıcı, alıcı ve ayarlayıcı yöntemleri" oluşturun

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Ardından adaptörleri, CustomAdapter.java için resim çekilebilir kaynakları aracılığıyla ayarlayın.

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

Ardından referansları ActivityClass.java üzerinden geçirin

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

projemin bir parçası, her şey çalışıyor! )

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

Bu kodun neden çalışması gerektiğine dair gerçekten bir açıklama eklemelisiniz - kodun kendisine de yorum ekleyebilirsiniz - mevcut haliyle, topluluğun geri kalanının çözmek için ne yaptığınızı anlamasına yardımcı olabilecek herhangi bir açıklama sağlamaz. / soruyu cevapla.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

'R' dosyası, uygulamanın çalışma zamanında oluşturulamaz. Kullanmak gibi başka alternatifler de kullanabilirsiniz if-elseveyaswitch-case


Bu, soruyla ilgili görünmüyor. Görünüşe göre, Ryeniden üretmeye çalışmak yerine, zaten var olan bir kaynağa bir görüntü görünümü oluşturmaya çalışıyor
Greyson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.