如何在android中动态设置可绘制的图像?

Posted

技术标签:

【中文标题】如何在android中动态设置可绘制的图像?【英文标题】:How to set the image from drawable dynamically in android? 【发布时间】:2012-07-29 01:43:24 【问题描述】:

我将与项目相关的图像存储在可绘制文件夹中。此外,我将图像名称存储在字符串变量中,并且动态地尝试将这些图像设置为图像视图。但是图像没有显示。请在这方面帮助我。

我的代码:

int res = getResources().getIdentifier(imagename, "drawable", this.getPackageName());
imageview= (ImageView)findViewById(R.id.imageView);
imageview.setImageResource(res);

在上面的代码中,“imagename”是包含图片名称的字符串变量。

提前致谢

【问题讨论】:

【参考方案1】:

试试这个:

String uri = "@drawable/myresource";  // where myresource (without the extension) is the file

int imageResource = getResources().getIdentifier(uri, null, getPackageName());

imageview= (ImageView)findViewById(R.id.imageView);
Drawable res = getResources().getDrawable(imageResource);
imageView.setImageDrawable(res);

【讨论】:

嗨,我试过你的代码,它显示错误为 android.content.res.Resources$NotFoundException: Resource ID #0x0 at line Drawable res = getResources().getDrawable(imageResource);请帮助我 您需要更改图片名称的 uri。喜欢“@drawable/MYIMAGENAME.extension” image_url 包含图像名称为“image.png” 它在没有 png 扩展名的情况下对我有用,但扩展名却给了我错误。所以你可以尝试不扩展 为什么扩展还在 cmets 中?我浪费了时间,直到我通过删除扩展名让它工作。即使我赞成你的答案,请编辑它。 Pi 日快乐 :)【参考方案2】:

这里我将frnd_inactive 图像从drawable 设置为图像

 imageview= (ImageView)findViewById(R.id.imageView);
 imageview.setImageDrawable(getResources().getDrawable(R.drawable.frnd_inactive));

【讨论】:

getDrawable(int) 已弃用。您应该改用 getDrawable(int, Theme)。【参考方案3】:
imageview= (ImageView)findViewById(R.id.imageView);
imageview.setImageResource(R.drawable.mydrawable);

【讨论】:

加上这个答案很简单 动态如何?文件名在这里看起来是静态的。【参考方案4】:

试试这个动态代码

String fnm = "cat"; //  this is image file name
String PACKAGE_NAME = getApplicationContext().getPackageName();
int imgId = getResources().getIdentifier(PACKAGE_NAME+":drawable/"+fnm , null, null);
System.out.println("IMG ID :: "+imgId);
System.out.println("PACKAGE_NAME :: "+PACKAGE_NAME);
//    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),imgId);
your_image_view.setImageBitmap(BitmapFactory.decodeResource(getResources(),imgId));

在上面的代码中,您将需要 Image-file-Name 和 Image-View 对象您都拥有

【讨论】:

非常感谢...此代码运行良好,您节省了我很多时间。 谢谢。这对我很有用: int imgId = getResources().getIdentifier(PACKAGE_NAME+":drawable/"+fnm , null, null); 非常感谢。工作 3 小时后,您的代码修复了我的错误。【参考方案5】:

请参阅下面的代码,这对我有用

iv.setImageResource(getResources().getIdentifier(
                "imagename", "drawable", "com.package.application"));

【讨论】:

使用 context.getPackageName() 作为包名【参考方案6】:

这对我有用(不要使用图像的扩展名,只使用名称):

String imagename = "myImage";
int res = getResources().getIdentifier(imagename, "drawable", this.getPackageName());
imageview= (ImageView)findViewById(R.id.imageView);
imageview.setImageResource(res);

【讨论】:

【参考方案7】:

这是目前在每部手机中都能使用的最佳方式。这些答案中的大多数已被弃用或需要 API >= 19 或 22。 您可以使用片段代码或活动代码取决于您的需要。

片段

//setting the bitmap from the drawable folder
Bitmap bitmap= BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.my_image);

//set the image to the imageView
imageView.setImageBitmap(bitmap);

活动

//setting the bitmap from the drawable folder
Bitmap bitmap= BitmapFactory.decodeResource(MyActivity.this.getResources(), R.drawable.my_image);

//set the image to the imageView
imageView.setImageBitmap(bitmap);

干杯!

【讨论】:

【参考方案8】:

像这样设置ImageViewimageView.setImageResource(R.drawable.image)

【讨论】:

【参考方案9】:
imageView.setImageResource(R.drawable.picname);

【讨论】:

【参考方案10】:

getDrawable() 已弃用,所以试试这个

imageView.setImageResource(R.drawable.fileName)

【讨论】:

这个解决方案对我有用。要添加,如果您需要清除 ImageView,只需:imageView.setImageResource(android.R.color.transparent)***.com/a/8243184/1657502【参考方案11】:

首先让您的图片名称为myimage。所以你要做的就是去Drawable并保存图片名称myimage

现在假设您只知道图像名称并且需要访问它。使用下面的sn-p来访问它,

您所做的是正确的,请确保您保存了要在编码中使用的图像名称。

public static int getResourceId(Context context, String name, String resourceType) 
    return context.getResources().getIdentifier(toResourceString(name), resourceType, context.getPackageName());


private static String toResourceString(String name) 
    return name.replace("(", "")
               .replace(")", "")
               .replace(" ", "_")
               .replace("-", "_")
               .replace("'", "")
               .replace("&", "")
               .toLowerCase();

除此之外,您还应确保没有空格和区分大小写

【讨论】:

【参考方案12】:

从 API 22 开始,getResources().getDrawable() 已弃用(另请参阅 Android getResources().getDrawable() deprecated API 22)。这是一种动态设置图片资源的新方法:

String resourceId = "@drawable/myResourceName"; // where myResourceName is the name of your resource file, minus the file extension
int imageResource = getResources().getIdentifier(resourceId, null, getPackageName());
Drawable drawable = ContextCompat.getDrawable(this, imageResource); // For API 21+, gets a drawable styled for theme of passed Context
imageview = (ImageView) findViewById(R.id.imageView);
imageview.setImageDrawable(drawable);

【讨论】:

【参考方案13】:

这是在 Kotlin 中的操作方法,在循环内 i:

从rfsbraz 的回答中重复使用的代码

    val uri = "@drawable/pic_top$i+1"
    val imageResource = activity.resources.getIdentifier(uri, null, activity.packageName)

    val res = activity.getResources().getDrawable(imageResource)
    holder.view.imgDigit.setImageDrawable(res)

【讨论】:

活动应该是什么?【参考方案14】:

getDrawable() 已弃用。 现在你可以使用

imageView.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.msg_status_client_read)) 

【讨论】:

【参考方案15】:

这对我来说很好。

final R.drawable drawableResources = new R.drawable(); 
final Class<R.drawable> c = R.drawable.class;
final Field[] fields = c.getDeclaredFields();
for (int i=0; i < fields.length;i++) 

     resourceId[i] = fields[i].getInt(drawableResources);  
    /* till here you get all the images into the int array resourceId.*/

imageview= (ImageView)findViewById(R.id.imageView);
if(your condition)

   imageview.setImageResource(resourceId[any]);

【讨论】:

resourceId[i] = fields[i].getInt(drawableResources);在这一行中出现错误原因:java.lang.IllegalArgumentException:不是原始字段【参考方案16】:
int[] phptr=new int[5];

将图像指针添加到数组

for(int lv=0;lv<3;lv++)
    
        String id="a"+String.valueOf(lv+1);
        phptr[lv]= getResources().getIdentifier(id, "drawable", getPackageName());
    

for(int loopvariable=0;loopvariable<3;loopvariable++) 
    
        et[loopvariable] = findViewById(p[loopvariable]);
    



for(int lv=0;lv<3;lv++)
    
        et[k].setImageResource(phptr[k]);
    

【讨论】:

【参考方案17】:
ImageView imageView=findViewById(R.id.imageView)

如果您在可绘制文件夹中有图像,则使用

imageView.setImageResource(R.drawable.imageView)

如果你有 uri 并想在 imageView 中显示它,那么使用

imageView.setImageUri("uri")

如果您有位图并想在 imageView 中显示它,请使用

imageView.setImageBitmap(bitmap)

注意:- 1. imageView.setImageDrawable() 现在在 java 中已弃用 2. 如果图像 uri 来自 firebase 或任何其他在线链接,则使用

    Picasso.get()
    .load("uri")
    .into(imageView)

(https://github.com/square/picasso)

或使用

Glide.with(context)
            .load("uri")
            .into(imageView)

(https://github.com/bumptech/glide)

【讨论】:

以上是关于如何在android中动态设置可绘制的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何从可绘制文件夹上的图像获取路径并设置为图像视图,位图?

动态设置可绘制文件夹中的ImageView

如何在android中改变可绘制形状的颜色

如何从 URL 下载图像并将其动态存储在我的应用程序的可绘制文件夹中?

Android - 如何显示来自可绘制资源的图像?

如何在 Android Studio 中使用 AsyncTask 从可绘制对象中设置图像