通常我们都会使用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");
}