Sử dụng setImageDrawable động để đặt hình ảnh trong ImageView


120

Tôi đang tạo động một chuỗi từ cơ sở dữ liệu có cùng tên hình ảnh trong drawablethư mục.

Bây giờ tôi muốn đặt giá trị đó để ImageViewsử dụng setImageDrawable(R.id.StringGenerated)động.

Bất kỳ đề xuất..


có nghĩa là bạn đang tạo ID của hình ảnh động, phải không?
Paresh Mayani

Câu trả lời:


195

Thử cái này,

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

Thao tác này sẽ trả về id của tệp có thể vẽ mà bạn muốn truy cập ... sau đó bạn có thể đặt hình ảnh trong chế độ xem hình ảnh bằng cách thực hiện như sau

imageview.setImageResource(id);

Cảm ơn rất nhiều..tôi đã tìm thấy nó ở một nơi khác bt vẫn cảm ơn vì những nỗ lực của bạn .. :)
Arun

12
Tuy nhiên, việc sử dụng setImageResource () "không đọc và giải mã Bitmap trên chuỗi giao diện người dùng, điều này có thể gây ra lỗi độ trễ ... hãy xem xét sử dụng setImageDrawable () hoặc setImageBitmap ()." (Tài liệu Android)
chetto

6
Bạn cũng có thể nhận được id bằng cách đơn giản sử dụng: 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);

hoặc là

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

anh ấy cho biết anh ấy đang tạo động một chuỗi từ cơ sở dữ liệu có cùng tên của hình ảnh.
Paresh Mayani

3
getDrawable (R.drawable.icon) bị phản đối
Daryn

Đối với những người cần giải quyết getDrawable (R.drawable.icon) không được dùng nữa, hãy thử đọc liên kết SO
Codingpan

77

Cá nhân tôi thích sử dụng phương pháp setImageResource()như thế này.

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

1
cái này thắng vì bạn có thể muốn thay đổi hình ảnh từ bất kỳ vị trí nào trong mã của mình mà bạn không có ngữ cảnh để gọi phương thức getResources () trên đó. ví dụ như trong Bộ điều hợp. Không cần phải chuyển ngữ cảnh qua hàm tạo chỉ vì tính vui nhộn này.
Phatee P

1
sạch hơn. Tôi không hiểu tại sao đây không phải là câu trả lời ưa thích.
Benjamin Basmaci

@BenjaminBasmaci Đây là chức năng đọc và giải mã Bitmap trên chuỗi giao diện người dùng, điều này có thể gây ra lỗi độ trễ. Nếu đó là mối quan tâm, hãy cân nhắc sử dụng setImageDrawable (android.graphics.drawable.Drawable) hoặc setImageBitmap (android.graphics.Bitmap) và BitmapFactory thay thế. (Từ Tài liệu Android)
Tayyab Mazhar

25

Các tên có thể vẽ được của tài nguyên không được lưu trữ dưới dạng chuỗi, vì vậy bạn sẽ phải phân giải chuỗi thành hằng số nguyên được tạo trong quá trình xây dựng. Bạn có thể sử dụng Resourceslớp để phân giải chuỗi thành số nguyên đó.

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

Điều này giải quyết chuỗi đã tạo của bạn thành số nguyên ImageViewcó thể sử dụng để tải hình ảnh phù hợp.

Ngoài ra, bạn có thể sử dụng id để tải Drawablethủ công và sau đó đặt hình ảnh bằng cách sử dụng có thể vẽ đó thay vì ID tài nguyên.

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

@Greyson ... Đẹp lắm thưa ngài..đó là điều tôi đang tìm kiếm..Cảm ơn rất nhiều .. :)
Arun

13

Đơn giản như câu trả lời này:

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

8

Điều này hoạt động, ít nhất là trong 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);

Bạn có thể sử dụng setImageResource (), nhưng tài liệu chỉ định rằng "đọc và giải mã Bitmap trên chuỗi giao diện người dùng, điều này có thể gây ra lỗi độ trễ ... hãy xem xét sử dụng setImageDrawable () hoặc setImageBitmap ()." như đã nói bởi chetto


7

Tất cả các câu trả lời được đăng không áp dụng ngày hôm nay. Ví dụ: getDrawable () không được dùng nữa. Đây là một câu trả lời được cập nhật, chúc mừng!

ContextCompat.getDrawable(mContext, drawable)

Từ phương pháp tài liệu

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


Cảm ơn vì đã đề cập đến phần không dùng nữa.
Karan Sharma

6

Bạn có thể thử sử dụng mã này:

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

4

Nếu bạn không thể nhận đối tượng Tài nguyên như thế này trong một lớp không phải là Hoạt động, bạn phải thêm phương thức getContext () cho getResources () chẳng hạn

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

Bạn cũng có thể sử dụng một cái gì đó như:

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

hoặc sử dụng Picasso:

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


0

Tôi đã gặp vấn đề tương tự như bạn và tôi đã làm như sau để giải quyết nó:

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

0

Xây dựng lớp POJO.java và tạo "phương thức constructor, getter & setter"

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Sau đó, thiết lập các bộ điều hợp thông qua các tài nguyên có thể vẽ hình ảnh thành 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());
        }
    }

Sau đó, chuyển các tham chiếu qua 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

một phần trong dự án của tôi, mọi thứ đều hoạt động! )

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

Bạn thực sự nên thêm một số giải thích về lý do tại sao mã này nên hoạt động - bạn cũng có thể thêm nhận xét trong chính mã - ở dạng hiện tại, nó không cung cấp bất kỳ lời giải thích nào có thể giúp phần còn lại của cộng đồng hiểu những gì bạn đã làm để giải quyết /trả lời câu hỏi.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

Không thể tạo tệp 'R' tại thời điểm chạy ứng dụng. Bạn có thể sử dụng một số lựa chọn thay thế khác như sử dụng if-elsehoặcswitch-case


Điều này dường như không liên quan đến câu hỏi. Có vẻ như ông đang cố gắng thiết lập một ImageView để một nguồn tài nguyên đã tồn tại, chứ không phải là cố gắng để tạo ra Rmột lần nữa
Greyson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.