2010-05-10 41 views
11

我正在爲一些Android應用程序與其他人一起工作,主要內容由我們的設計者以特定文件格式指定爲文本文件,然後我們將其解析,處理並在應用中投放。我們目前正在將它們存儲在res/raw中。以編程方式訪問res/raw的內容(Android)

這對設計師來說很好,因爲當他們想添加內容時,他們只需將文件添加到res/raw即可。然而,作爲一名開發人員,這很煩人,因爲我們的開發人員需要將R.raw.the_new_file添加到代碼中指定要在啓動時處理哪些文件的數組中。

有沒有辦法以編程方式訪問資源ID的res/raw?理想情況下,當應用程序啓動時,我們可以打電話查看res/raw中的哪些文件,處理所有這些文件,因此我們可以通過在代碼中將res/raw的內容與我們的數組的內容進行匹配來消除小的開銷。

我見過的最有希望的路徑是從ResourcesgetAssets,這將讓我叫list(String)AssetManager,但我有麻煩這項工作,特別是因爲你不能直接調用"res/raw"爲您的文件路徑(或至少,它沒有當我嘗試的工作。

建議?謝謝

回答

15

您可以使用反射。


ArrayList<Integer> list = new ArrayList<Integer>(); 
Field[] fields = R.raw.class.getFields(); 
for(Field f : fields) 
try { 
     list.add(f.getInt(null)); 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { } 

之後列表保存res/raw文件夾中的所有資源ID。 如果您需要資源的名稱... f.getName()會返回它。

+0

謝謝,遲到接受但我忘記了我沒有。像魅力一樣工作! – 2010-06-26 14:23:48

1

你可以使用

Context.getResources().getIdentifier("filename", "raw", "packagename"); 

能得到相應的我dentifier。但是我不明白你爲什麼實施你的解決方案很複雜?設計師有什麼優勢?爲什麼他們不把文件放在可繪製的文件夾中?

+0

這其實不是圖形,而是遊戲中的關卡。每個級別都有一個靜態地圖,一個可變數量的動態對象,這些對象的位置,特定級別的通知,一些配置等等。我們沒有讓關卡設計師直接編輯我們的代碼庫,而是編寫了一個解析器讓他們在文本文件中聲明級別指定級別;我們選擇將它們放在res/raw中。 感謝您的提示!我會試一試,讓你知道它是如何發生的^ _^ – 2010-05-10 18:16:27

5

這個答案可能有點晚,您應該使用資產文件夾來代替。在那裏您可以擁有一個文件夾層次結構並將其作爲文件系統讀取。

對於您的信息,getAssets會返回Android項目的「assets」文件夾中的文件的管理器,而不是「res/raw」中的文件。 「res/raw」進入「R」Java包。 assets.list(path)返回給定文件夾中相對於資產文件夾的文件數組。該資產的文件夾也不是傳統文件夾,但Android會將其抽象化,以便像「普通文件」那樣「感覺」。如果您正在執行JNI並希望從c/C++讀取您的資產,這變得更加重要。