Menggunakan setImageDrawable secara dinamis untuk menyetel gambar dalam ImageView


120

Saya membuat string dari database secara dinamis yang memiliki nama gambar yang sama di drawablefolder.

Sekarang saya ingin menetapkan nilai itu untuk ImageViewdigunakan setImageDrawable(R.id.StringGenerated)secara dinamis.

Ada Saran ..


berarti Anda membuat ID gambar secara dinamis, bukan?
Paresh Mayani

Jawaban:


195

Coba ini,

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

Ini akan mengembalikan id drawable yang ingin Anda akses ... lalu Anda dapat menyetel gambar di imageview dengan melakukan hal berikut

imageview.setImageResource(id);

Terima kasih banyak .. saya menemukannya di tempat lain tapi masih terima kasih atas Usaha Anda .. :)
Arun

12
Namun menggunakan setImageResource () "melakukan pembacaan dan dekode Bitmap pada thread UI, yang dapat menyebabkan cegukan latensi ... pertimbangkan untuk menggunakan setImageDrawable () atau setImageBitmap ()." (Dokumentasi Android)
chetto

6
Anda juga bisa mendapatkan id hanya dengan menggunakan: 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);

atau

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

Dia mengatakan dia membuat string dari database secara dinamis dengan nama gambar yang sama.
Paresh Mayani

3
getDrawable (R.drawable.icon) tidak digunakan lagi
Daryn

Bagi orang yang perlu menyelesaikan getDrawable (R.drawable.icon) tidak digunakan lagi, coba baca tautan SO
Codingpan

77

Saya pribadi lebih suka menggunakan cara setImageResource()seperti ini.

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

1
yang satu ini menang karena Anda mungkin ingin mengubah gambar dari tempat mana pun di kode Anda di mana Anda tidak memiliki konteks untuk memanggil metode getResources () di atasnya. misalnya di Adaptor. Tidak perlu melewati konteks melalui konstruktor hanya untuk fungsi ini.
Phatee P

1
jauh lebih bersih. Saya tidak mengerti mengapa ini bukan jawaban yang disukai.
Benjamin Basmaci

@BenjaminBasmaci Ini melakukan pembacaan dan dekode Bitmap pada thread UI, yang dapat menyebabkan gangguan latensi. Jika itu mengkhawatirkan, pertimbangkan untuk menggunakan setImageDrawable (android.graphics.drawable.Drawable) atau setImageBitmap (android.graphics.Bitmap) dan BitmapFactory. (Dari Dokumentasi Android)
Tayyab Mazhar

25

Nama resource drawable tidak disimpan sebagai string, jadi Anda harus menyelesaikan string tersebut menjadi konstanta integer yang dihasilkan selama pembuatan. Anda dapat menggunakan Resourceskelas untuk menyelesaikan string menjadi integer itu.

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

Ini menyelesaikan string yang Anda buat menjadi bilangan bulat yang ImageViewdapat digunakan untuk memuat gambar yang benar.

Alternatifnya, Anda bisa menggunakan id untuk memuat Drawablesecara manual, lalu menyetel gambar menggunakan drawable tersebut, bukan ID resource.

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

@Greyson ... Bagus pak..tzlah apa yang saya cari..Terima kasih banyak .. :)
Arun

13

Sesederhana jawaban ini:

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

8

Ini berfungsi, setidaknya di 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);

Anda bisa menggunakan setImageResource (), tetapi dokumentasinya menetapkan bahwa "melakukan pembacaan dan dekode Bitmap pada thread UI, yang bisa menyebabkan cegukan latensi ... pertimbangkan untuk menggunakan setImageDrawable () atau setImageBitmap ()." seperti yang dinyatakan oleh chetto


7

Semua jawaban yang diposting tidak berlaku hari ini. Misalnya, getDrawable () tidak digunakan lagi. Ini jawaban terbaru, hai!

ContextCompat.getDrawable(mContext, drawable)

Dari metode terdokumentasi

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


Terima kasih telah menyebutkan bagian yang tidak berlaku lagi.
Karan Sharma

6

Anda dapat mencoba menggunakan kode ini:

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

4

Jika Anda tidak bisa mendapatkan objek Resources seperti ini di kelas yang bukan Activity, Anda harus menambahkan metode getContext () untuk getResources () misalnya

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

Anda juga dapat menggunakan sesuatu seperti:

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

atau menggunakan Picasso:

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


0

Saya memiliki masalah yang sama seperti Anda dan saya melakukan hal berikut untuk menyelesaikannya:

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

0

Buat kelas POJO.java dan buat "metode konstruktor, pengambil & penyetel"

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Kemudian siapkan adaptor melalui sumber daya gambar yang dapat digambar ke 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());
        }
    }

Kemudian teruskan referensi melalui 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

bagian dari proyek saya, semuanya bekerja! )

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

Anda benar-benar harus menambahkan beberapa penjelasan tentang mengapa kode ini harus berfungsi - Anda juga dapat menambahkan komentar di kode itu sendiri - dalam bentuknya saat ini, tidak memberikan penjelasan apa pun yang dapat membantu komunitas lainnya untuk memahami apa yang Anda lakukan untuk menyelesaikannya. Aku jawab pertanyaannya.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

File 'R' tidak dapat dibuat pada saat aplikasi dijalankan. Anda dapat menggunakan beberapa alternatif lain seperti menggunakan if-elseatauswitch-case


Ini sepertinya tidak berhubungan dengan pertanyaan itu. Sepertinya dia mencoba menyetel imageview ke sumber daya yang sudah ada, daripada mencoba membuat Rlagi
Greyson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.