2012-03-05 49 views
1

我希望能夠從res/drawable動態加載圖像。我不會有多少文件,但我知道它們將按照慣例命名爲「image_N」,其中N是順序整數。在應用程序運行時可能會上傳新圖像。Android(min 2.1):從名稱字符串中加載圖像

我的代碼基本上是

Resources rs = getResources(); 
String imgName = "android.resource://" + this.getPackageName() + "/drawable/image_" + i; 
int imgID = rs.getIdentifier(imgName , null, getPackageName()); 

if (imgID != 0) 
{ 
    Drawable d = rs.getDrawable(imgID); 
    //etc. 
} 

imgID返回總是0

我也嘗試另一種方法

String imgName = "android.resource://" + this.getPackageName() + "/drawable/image_" + i; 
b = BitmapFactory.decodeFile(imgName); 
if (b != null) 
//etc 

b總是null

我知道文件夾中有正確的名稱,因爲我在那裏放了幾個。不知道我做錯了什麼。任何幫助將不勝感激!

回答

0

我想你已經錯誤地編譯了資源文件夾內的文件。在Android中,據我所知,資源是靜態的。編譯完成後,您無法通過在「drawable」文件夾中刪除文件來添加新資源,因此新文件不會有ID。 你應該在DATA中使用一個文件夾,或者更好地用getFilesDir()或類似的東西來詢問Android API。

欲瞭解更多信息,請查看>>here

+0

啊!謝謝。如果那是真的,它會讓事情變得更容易和更難。 :)我放在res/drawable中的默認圖像應該可以直接引用(也許通過foreach語句?),而其他的我需要通過文件資源 - 或者通過URL API加載。 – 2012-03-06 01:48:02

+0

對於R.drawable中圖像的默認列表,我發現解決方案的一部分(這裏)[http://stackoverflow.com/a/3950277/1181368]。 – 2012-03-06 03:33:16

0

我用這個:

String drawableName = "drawableNameAsDeclaredInDrawableDir" // in your case "image_" + i; 
int drawableResId = resources.getIdentifier(packageName + ":drawable/" + drawableName, null, null); 

然後使用

Drawable d = resources.getDrawable(drawableResId); 
+0

順便說一句,ruhalde指出你不能在運行時添加可繪製的資源。您將不得不在SD卡或內存上加載新圖像。 – YuviDroid 2012-03-06 00:08:02

+0

Hi YuviDroid - 謝謝!但是你的代碼與我的基本相同,不是嗎?除了看起來你忘了''android:resource //「'。 – 2012-03-06 01:44:56

2

我相信你正在使用getIdentifier(...)不正確。這應該工作:

int id = Context.getResources().getIdentifier("image_" + i, "drawable", getPackageName()); 

這將是equivilent在適配器的ID R.drawable.image_<+i>

+0

我的最終代碼確實有一條看起來像這樣的線。 :) 謝謝! – 2012-03-06 03:41:28

0

我用這個

Context context; 
    public MyAdapter0(Context context, 
    List<String> moduleList,List<String> moduleList2) { 
    mInflater = LayoutInflater.from(context); 
    for (int i=0;i<moduleList.size();i++) { 
    int id = context.getResources().getIdentifier("color6_"+i, 
    "drawable", context.getPackageName()); 
    mItems.add(new Item(moduleList.get(i),moduleList2.get(i),id)); 
    // Log.d("idimage", String.valueOf(R.drawable.color6)); 
    }