(Android)關於獲取資源文件R中的數據

通常我們都會使用context.getResources().getIdentifier(name, type,context.getPackageName())的方法去獲取R.java中的數據。

type——R其中的內部類名,如”drawable”,”string”,”color”,”dimen”,”layout”等,這也是我們常用的關於界面所需要獲取的數據類型。

name——R內部類中的static變量名稱,如”appname”等,這些都是有用戶在xml文件中定義的,包括layout,drawable文件中xml的文件名稱。

最後一個參數就是apk的包名。

其實為何使用context.getResources().getIdentifier來獲取資源的數值,很簡單,在開發屬於自己的sdk的時候,因為你的資源文件和jar包供給其他人使用,在界面方面自然都會使用此方法來獲取資源對應數值。

接著回到正題,因為在開發屬於自己的控件,用到瞭attr自定義屬性,在期間發現一個問題,即styleable的數值無法使用context.getResources().getIdentifier來獲取,結果永遠都是0,而且styleable中還包括數組數據,所以最後還是用java的反射方法來獲取。上代碼:

/**

* 對於context.getResources().getIdentifier無法獲取的數據,或者數組

* 資源反射值

* @paramcontext

* @param name

* @param type

* @return

*/

private static Object getResourceId(Context context,String name, String type) {

String className = context.getPackageName() +”.R”;

try {

Class cls = Class.forName(className);

for (Class childClass : cls.getClasses()) {

String simple = childClass.getSimpleName();

if (simple.equals(type)) {

for (Field field : childClass.getFields()) {

String fieldName = field.getName();

if (fieldName.equals(name)) {

System.out.println(fieldName);

return field.get(null);

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

*context.getResources().getIdentifier無法獲取到styleable的數據

* @paramcontext

* @param name

* @return

*/

public static int getStyleable(Context context, Stringname) {

return ((Integer)getResourceId(context, name,”styleable”)).intValue();

}

/**

* 獲取styleable的ID號數組

* @paramcontext

* @param name

* @return

*/

public static int[] getStyleableArray(Context context,String name) {

return (int[])getResourceId(context, name,”styleable”);

}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。