【问题标题】:Using setImageDrawable dynamically to set image in an ImageView动态使用 setImageDrawable 在 ImageView 中设置图像
【发布时间】:2012-01-28 09:26:45
【问题描述】:

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

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

任何建议..

【问题讨论】:

  • 意思是动态生成图片的ID,对吧?

标签: android android-widget


【解决方案1】:

试试这个,

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

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

imageview.setImageResource(id);

【讨论】:

  • 非常感谢..我在其他地方找到了它,但仍然感谢您的努力.. :)
  • 但是使用 setImageResource() “在 UI 线程上读取和解码位图,这可能导致延迟打嗝……考虑使用 setImageDrawable() 或 setImageBitmap()。” (Android 文档)
  • 你也可以通过简单地使用来获取id:R.drawable.filemane
【解决方案2】:
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));

【讨论】:

  • 他说他正在从数据库中动态生成一个与图像同名的字符串。
  • getDrawable(R.drawable.icon) 已弃用
  • 对于需要解决 getDrawable(R.drawable.icon) 已弃用的人,请尝试阅读此SO link
【解决方案3】:

我个人更喜欢这样使用setImageResource()的方法。

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

【讨论】:

  • 这个获胜,因为您可能希望从代码中没有上下文调用 getResources() 方法的任何位置更改图像。例如在适配器中。不需要仅仅为了这个功能就通过构造函数传递上下文。
  • 方式更清洁。我不明白为什么这不是首选答案。
  • @BenjaminBasmaci 这会在 UI 线程上进行位图读取和解码,这可能会导致延迟打嗝。如果这是一个问题,请考虑改用 setImageDrawable(android.graphics.drawable.Drawable) 或 setImageBitmap(android.graphics.Bitmap) 和 BitmapFactory。 (来自 Android 文档)
【解决方案4】:

资源可绘制名称不存储为字符串,因此您必须将字符串解析为构建期间生成的整数常量。您可以使用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...不错的一位先生..这就是我要找的..非常感谢.. :)
【解决方案5】:

就像这个答案一样简单:

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

【讨论】:

    【解决方案6】:

    您可以尝试使用此代码:

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

    【讨论】:

      【解决方案7】:

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

      ContextCompat.getDrawable(mContext, drawable)
      

      来自记录的方法

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

      【讨论】:

      • 感谢您提及已弃用的部分。
      【解决方案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 所述

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

          如果你不能在一个非 Activity 的类中获取这样的资源对象,你必须为 getResources() 添加 getContext() 方法

          ImageView image = (ImageView) v.findViewById(R.id.item_image);
          int id = getContext().getResources().getIdentifier(imageName, "drawable", getContext().getPackageName());
          image.setImageResource(id);
          

          【讨论】:

            【解决方案11】:

            你也可以使用类似的东西:

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

            或使用毕加索:

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

            【讨论】:

              【解决方案12】:

              从 API 22 使用:

              Drawable myDrawable =  ResourcesCompat.getDrawable(getResources(), 
                                      R.drawable.dos_red, null);
              

              【讨论】:

                【解决方案13】:

                我遇到了和你一样的问题,我做了以下解决方法:

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

                【讨论】:

                  【解决方案14】:

                  构造一个 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));
                  
                      }
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    现在您可以使用 setImageDrawable(Drawable drawable)。示例:

                    ImageView iState = findViewById(R.id.imageview_state);
                    if (isOk){
                        iState.setImageDrawable(getDrawable(R.drawable.outline_ok));
                    }else{
                        iState.setImageDrawable(getDrawable(R.drawable.outline_no));
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      我的一个项目,一切正常! )

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

                      【讨论】:

                      • 你真的应该添加一些解释为什么这个代码应该工作 - 你也可以在代码本身中添加 cmets - 在它的当前形式中,它没有提供任何可以帮助其余部分的解释社区了解您为解决/回答问题所做的工作。
                      【解决方案17】:

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

                      API 23 Android 6.0

                      【讨论】:

                        【解决方案18】:

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

                        【讨论】:

                        • 这似乎与问题无关。似乎他正在尝试将图像视图设置为已经存在的资源,而不是尝试再次生成R
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-12-10
                        • 1970-01-01
                        • 2015-10-18
                        • 2012-09-19
                        相关资源
                        最近更新 更多