可以从传递String参数的资源中加载R.drawable吗?

时间:2011-03-06 17:12:09

标签: java android bitmap

可以从传递给R.drawable a String的资源中加载图像吗?

我正在尝试这个:

public static Bitmap LoadBitmap(Context context, String filename)
{
     Bitmap image;
     image = BitmapFactory.decodeResource(context.getResources(), R.drawable.filename);
     return image;
}

引发以下错误:

filename cannot be resolved or is not a field

我正在尝试在R文件中创建一个常量字段,但会抛出以下行:

R.java was modified manually! Reverting to generated version!

我将非常感谢您的帮助或建议。感谢

2 个答案:

答案 0 :(得分:9)

资源可以作为原始数据访问:使用AssetManager.open(..)。只需传递所需位图的文件名(例如“drawable / myimage.png”)。

然后,您可以使用BitmapFactory.decodeStream(..)从数据流创建位图。

<强>更新

public static Bitmap LoadBitmap(Context context, String filename){
    AssetManager assets = context.getResources().getAssets();
    InputStream buf = new BufferedInputStream((assets.open("drawable/myimage.png")));
    Bitmap bitmap = BitmapFactory.decodeStream(buf);
    // Drawable d = new BitmapDrawable(bitmap);
    return bitmap;
}

答案 1 :(得分:0)

@Peter Knego(没有足够的声誉来直接注释答案 - 愚蠢的SO)

我对资产经理的了解(有限)是它允许访问foo/assets目录中的文件。所以Peter的代码可以访问:

foo/assets/drawable/myimage.png

我认为@ karse23想知道他是否可以访问res/drawable目录中的图片:

foo/res/drawable/myimage.png

你为什么要这样做?好吧,如果你想从应用程序也访问第三方应用程序的资源。理想情况下,您使用来自拥有资源的应用程序中的R(因此您可以在布局中敲击该ID)以及第三方应用程序中的名称(您无权访问R类)来执行此操作。

我正在尝试这样做,而Peter的方法是在我的代码中引用资产目录(但是我再次访问另一个包中的资产)。 (您可以通过记录assetManager.list("")返回的字符串来检查这一点)。

为了支持彼得,医生说:

public final AssetManager getAssets ()
Retrieve underlying AssetManager storage for these resources.

它似乎支持彼得建议的行为(可能是我正在使用的旧Android中的一个错误???)。

总之,我认为解决方案是敲击资产目录中的文件并从代码中访问父应用程序:((或者像使用ContentProvider的android dudes那样)。