动态使用setImageDrawable在ImageView中设置图像


120

我正在从数据库动态生成一个字符串,该字符串与drawable文件夹中的图像名称相同。

现在,我想将该值设置为动态ImageView使用setImageDrawable(R.id.StringGenerated)

有什么建议..


表示您正在动态生成图像的ID,对吗?
Paresh Mayani

Answers:


195

试试这个,

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

这将返回您要访问的可绘制对象的ID ...然后您可以通过执行以下操作在imageview中设置图像

imageview.setImageResource(id);

感谢一吨..我发现它在其他地方bt仍然感谢您的努力.. :)
Arun

12
但是,使用setImageResource()会“在UI线程上进行位图读取和解码,这可能会导致延迟打...……请考虑使用setImageDrawable()或setImageBitmap()。” (Android文档)
chetto 2012年

6
您也可以通过以下简单方式获得ID: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()方法的任何位置更改图像。例如在适配器中。无需仅为此功能而通过构造函数传递上下文。
Phatee P

1
方式更清洁。我不明白为什么这不是首选的答案。
本杰明·巴斯马奇

@BenjaminBasmaci这会在UI线程上进行位图读取和解码,这可能会导致延迟打h。如果这是一个问题,请考虑改用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 );

@格雷森...好一个先生..thatz我在找什么..非常感谢..::)
Arun

13

如此简单的答案:

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

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()”。如切托所说


7

发布的所有答案均不适用于今天。例如,不赞成使用getDrawable()。这是更新的答案,干杯!

ContextCompat.getDrawable(mContext, drawable)

从记录的方法

公共静态最终android.graphics.drawable.Drawable getDrawable(@NotNull android.content.Context上下文,
@ android.support.annotation.DrawableRes int id


感谢您提及已弃用的部分。
卡兰·沙尔玛

6

您可以尝试使用以下代码:

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

4

如果您不能在不是Activity的类中获得像这样的Resources对象,则必须为getResources()添加getContext()方法。

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

您还可以使用类似:

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

或使用毕加索:

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


0

我遇到了与您相同的问题,并且做了以下操作来解决该问题:

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

0

构造一个POJO.java类,并创建“构造函数,getter和setter方法”

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

-3

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

API 23 Android 6.0


-4

无法在应用程序运行时生成“ R”文件。您可以使用其他替代方法,例如使用if-elseswitch-case


这似乎与问题无关。似乎他正在尝试将图像视图设置为已经存在的资源,而不是尝试R再次生成图像
-Greyson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.