2011-03-06 23 views
2

可以從資源傳遞給R.的圖像加載一個String。可以從傳遞String參數的資源加載R.drawable?

我想這一點:

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檔creatic恆定的場,而拋出下面一行:

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

我會感謝您的幫助或建議。謝謝

回答

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; 
} 
+0

你能不能舉個例子嗎?我可以用inputstream來做嗎?謝謝 – karse23 2011-03-06 17:30:15

0

@Peter Knego(沒有足夠的聲譽直接標註了答案 - 愚蠢的SO)

資產管理人的我(有限)的理解是,它允許訪問foo/assets目錄中的文件。因此,從彼得代碼將訪問:

foo/assets/drawable/myimage.png

我覺得@ karse23想知道他是否可以在res/drawable目錄訪問圖片:

foo/res/drawable/myimage.png

你爲什麼要這麼做?那麼如果你想從應用程序也可以訪問第三方應用程序的資源。理想情況下,您可以在擁有資源的應用程序中使用R(因此您可以在佈局中使用該ID)並在第三方應用程序(無法訪問R類)中使用名稱。

我試圖做到這一點,彼得的方法是在我的代碼中引用資產目錄(但我再次訪問另一個包中的資產)。 (你可以通過記錄assetManager.list("")返回的字符串來檢查這一點)。

在支持彼得的醫生說:

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

這似乎支持的行爲彼得建議(也許在舊的Android我使用???一個bug)。

最後,我認爲解決的辦法是重擊文件在資產目錄和代碼訪問它們的父應用程序:((或做Android的帥哥使用ContentProvider的意圖的方式)。