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

Arun
sumber
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);
Raja RV
sumber
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));
NikhilReddy
sumber
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);
jlopez.dll
sumber
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
sumber
@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);
Ahmad Arslan
sumber
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

ulang
sumber
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

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

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

lxknvlk.dll
sumber
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);

ninjahoahong
sumber
0

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

**IMAGEVIEW**.setImageResource(getActivity()
             .getResources()
             .getIdentifier("**IMG**", "drawable", getActivity()
             .getPackageName()));
JCDecary
sumber
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));

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

isaac
sumber
-4

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

Vinod Maurya
sumber
Ini sepertinya tidak berhubungan dengan pertanyaan itu. Sepertinya dia mencoba menyetel imageview ke sumber daya yang sudah ada, daripada mencoba membuat Rlagi
Greyson