2012-09-12 47 views
14

我有使用Android庫(com.appocaliptic.quizknife.core)的Android項目(com.appocaliptic.quizknife.app)。Android - getIdentifier總是返回0(庫+應用程序)

我想要做的是獲取作爲庫的圖片的資源ID。路徑爲:res/drawable-xhdpi/fr_200_133.png

但是,所有使用getIdentifier的嘗試結果爲0.問題出在哪裏?

resId = getResources().getIdentifier("fr_200_133", "drawable", "com.appocaliptic.quizknife.core"); 
resId = getResources().getIdentifier("com.appocaliptic.quizknife.core:drawable/"+"fr_200_133", null, null); 
resId = getResources().getIdentifier("drawable/fr_200_133", null, "com.appocaliptic.quizknife.core"); 

被修改:

乙酰膽鹼,而在R.java有可拉伸和corensponding屬性。

+0

您正在測試的系統是否具有xhdpi分辨率的屏幕? – Squonk

+1

@Squonk - 當檢索id本身時,這應該沒有關係;只有在檢索與id相關的drawable時纔是如此。此外,對於可繪製資源,系統將找到[最佳匹配](http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch),因此它將使用xhdpi資源(在縮放),即使在ldpi設備上。 –

+0

@TedHopp:同意 - 我忘記了可繪製資源的最佳匹配。 – Squonk

回答

26

您不應該使用庫包名稱。 (如果這是在視圖中執行或getContext().getPackageName()

resId = getResources().getIdentifier("fr_200_133", "drawable", getPackageName()); 

:嘗試這個代替。

+0

哇,它的作品O_o。非常感謝 - 順便說一句 - 這些信息的來源?我發現他們建議的所有資源都使用String包名稱。謝謝。 – bluszcz

+2

@bluszcz - 我想我從某個地方的例子中找到了這個成語。關鍵在於您需要使用應用程序的包名稱(如清單中所列)而不是庫的包名稱(實際在創建應用程序時會消失)。 –

+0

我相信你應該發表你的評論和答覆 - 這是非常重要的信息;) – bluszcz

27

我面臨同樣的問題:「則getIdentifier結果0」和我解決它通過去除圖像擴展(* .JPG,* .JPEG,...等),要在匹配的名稱,因爲它R. java的文件

10

我得到了同樣的錯誤,並只曾在以不同的方式正想關於它的事情:

resourceId = R.drawable.class.getField("fr_200_133").getInt(null); 
1

我有一個類似的問題。我可以像Hussam Otri提到的那樣解決它。例如:

//This doesn't work 
context.getResources().getIdentifier("audio_1.mp3", "raw", this.getPackageName()); 

//This works (strip off the file extension) 
context.getResources().getIdentifier("audio_1", "raw", this.getPackageName());