การใช้ setImageDrawable แบบไดนามิกเพื่อตั้งค่ารูปภาพใน ImageView


120

ฉันกำลังสร้างสตริงจากฐานข้อมูลแบบไดนามิกซึ่งมีชื่อเดียวกันของรูปภาพในdrawableโฟลเดอร์

ตอนนี้ฉันต้องการตั้งค่านั้นสำหรับการImageViewใช้setImageDrawable(R.id.StringGenerated)แบบไดนามิก

ข้อเสนอแนะใด ๆ ..


หมายความว่าคุณกำลังสร้าง ID ของรูปภาพแบบไดนามิกใช่ไหม
Paresh Mayani

คำตอบ:


195

ลองสิ่งนี้

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

สิ่งนี้จะส่งคืน id ของ drawable ที่คุณต้องการเข้าถึง ... จากนั้นคุณสามารถตั้งค่าภาพใน imageview โดยทำดังต่อไปนี้

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

เขากล่าวว่าเขากำลังสร้างสตริงจากฐานข้อมูลแบบไดนามิกโดยใช้ชื่อรูปภาพเดียวกัน
Paresh Mayani

3
getDrawable (R.drawable.icon) เลิกใช้งานแล้ว
Daryn

สำหรับผู้ที่ต้องการแก้ไข getDrawable (R.drawable.icon) เลิกใช้งานแล้วให้ลองอ่านลิงก์ SO
Codingpan

77

ฉันเองชอบที่จะใช้วิธีการsetImageResource()เช่นนี้

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

1
อันนี้ชนะเนื่องจากคุณอาจต้องการเปลี่ยนรูปภาพจากที่ใด ๆ ในโค้ดของคุณโดยที่คุณไม่มีบริบทในการเรียกใช้เมธอด getResources () เช่นใน Adapters ไม่จำเป็นต้องส่งบริบทผ่านตัวสร้างเพียงเพื่อความสนุกสนานนี้
พะตี

1
วิธีที่สะอาดกว่า ฉันไม่เข้าใจว่าเหตุใดจึงไม่ใช่คำตอบที่ต้องการ
Benjamin Basmaci

@BenjaminBasmaci นี่เป็นการอ่านและถอดรหัส Bitmap บนเธรด UI ซึ่งอาจทำให้เกิดอาการสะอึกในเวลาแฝง หากเป็นข้อกังวลให้ลองใช้ setImageDrawable (android.graphics.drawable.Drawable) หรือ setImageBitmap (android.graphics.Bitmap) และ BitmapFactory แทน (จากเอกสาร Android)
Tayyab Mazhar

25

ชื่อทรัพยากรที่ดึงได้จะไม่ถูกจัดเก็บเป็นสตริงดังนั้นคุณจะต้องแก้ไขสตริงเป็นค่าคงที่จำนวนเต็มที่สร้างขึ้นระหว่างการสร้าง คุณสามารถใช้Resourcesคลาสเพื่อแก้ไขสตริงเป็นจำนวนเต็มนั้น

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

สิ่งนี้จะแก้ไขสตริงที่คุณสร้างขึ้นเป็นจำนวนเต็มที่ImageViewสามารถใช้เพื่อโหลดรูปภาพที่ถูกต้อง

อีกวิธีหนึ่งคือคุณสามารถใช้ id เพื่อโหลดDrawableด้วยตนเองจากนั้นตั้งค่ารูปภาพโดยใช้ที่วาดได้แทน ID ทรัพยากร

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

@Greyson ... Nice one sir..thatz what I am looking for .. ขอบคุณมาก .. :)
อรุณ


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 ()" ตามที่ระบุไว้โดย chetto


7

คำตอบทั้งหมดที่โพสต์ใช้ไม่ได้ในวันนี้ ตัวอย่างเช่น getDrawable () เลิกใช้แล้ว นี่คือคำตอบที่อัปเดตไชโย!

ContextCompat.getDrawable(mContext, drawable)

จากเอกสารวิธีการ

android.graphics.drawable สุดท้ายคงที่สาธารณะ getDrawable (@NotNull android.content.Context บริบท
@ android.support.annotation.DrawableRes int id


ขอขอบคุณที่กล่าวถึงส่วนที่เลิกใช้งาน
Karan Sharma


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:

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


0

ฉันมีปัญหาเดียวกันกับคุณและฉันได้ดำเนินการต่อไปนี้เพื่อแก้ไข:

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

0

สร้างคลาส POJO.java และสร้าง "constructor, getter & setter method"

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

จากนั้นส่งการอ้างอิงผ่าน 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

ชิ้นส่วนของโครงการของฉันทุกอย่างได้ผล! )

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

คุณควรเพิ่มคำอธิบายว่าทำไมโค้ดนี้จึงควรใช้งานได้ - คุณยังสามารถเพิ่มความคิดเห็นในโค้ดได้ - ในรูปแบบปัจจุบันจะไม่มีคำอธิบายใด ๆ ที่สามารถช่วยให้ชุมชนที่เหลือเข้าใจสิ่งที่คุณทำเพื่อแก้ปัญหา /ตอบคำถาม.
ishmaelMakitla


-4

ไม่สามารถสร้างไฟล์ 'R' ได้ในขณะทำงานของแอป คุณอาจใช้ทางเลือกอื่นเช่นการใช้if-elseหรือswitch-case


สิ่งนี้ดูเหมือนจะไม่เกี่ยวข้องกับคำถาม ดูเหมือนว่าเขาพยายามตั้งค่ามุมมองภาพเป็นทรัพยากรที่มีอยู่แล้วแทนที่จะพยายามสร้างRอีกครั้ง
Greyson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.