2012-04-09 501 views
1

我在嘗試獲取Android應用程序中的資源字段時收到異常。這似乎是正確的方式來訪問一個可繪製的ID。任何建議可能是錯誤的?使用getField訪問資源

04-09 22:45:59.816: W/System.err(5014): java.lang.NoSuchFieldException: lumiere 

在我的res/drawable文件夾中,我有「lumiere.jpg」。從R.java:

public static final class drawable { 
    [...] 
    public static final int lumiere=0x7f02000a; 

方法調用:

Class c = R.drawable.class; 
field = c.getField(name); 
i = new Integer(field.getInt(null)); 

我不認爲這事情,是一個靜態類方法調用,但以防萬一它 - 上面的代碼是在普通的Java類,而不是一個Activity。只是覺得我會提到,因爲訪問資源似乎限制在活動之外。

回答

0

我認爲你需要提供類的對象調用getInt方法時:

Integer i = null;  

    try { 
     Class c = R.drawable.class; 
     Field field = c.getField(name); 
     if(field != null){ 
      i = new Integer(field.getInt(c)); //provide 'c' in getInt 
     } 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

閱讀this

+0

感謝您的建議,但事實並非如此。 實際上,您無法使用此方法從普通Java類訪問資源。 – Marc 2012-04-09 23:17:26

+0

是不是你爲了得到價值而做的或多或少的事情? – waqaslam 2012-04-09 23:25:27

+0

不知道我明白。也許我上面的陳述措辭不好。如果我的帖子中的代碼放置在Activity類中,但不在標準的Java類中,則我的帖子中的代碼可以工作。我認爲這是由於缺乏背景。 – Marc 2012-04-09 23:50:42

0

我相信你的意思是使用c.getDeclaredField(name)。另外(這可能是更正確的方法),你可以使用Resources對象來獲取ID。見this question/answer

+0

我也嘗試過使用這種方法,沒有骰子。 – Marc 2012-04-10 21:10:12

0

不幸的是,您似乎實際上不能使用它來訪問普通Java類中包含的R.java文件中的資源。當我將代碼複製到一個Activity類中時,它沒有拋出異常並返回一個值。

+0

有趣。不同的類加載器? – dmon 2012-04-11 14:53:48