在制作Cordova插件时不能通过R文件来寻找资源Id,因为R文件是不断变化的,所以我们必须要通过资源名称来获取Id,下面就介绍一下资源id的获取:
- 使用Resources 类的 getIdentifier方法
-
通过资源名称虚招布局文件的id
private int getResId(String resourceName){ Resources resources = getResources(); int resId = resources.getIdentifier(resourceName,"layout",getPackageName()); return resId; }
-
获取字符串id
private int getStringId(String stringName){ Resources resources = getResources(); int resId =resources.getIdentifier(stringName,"string", getPackageName()); return resId; }
-
获取控件id
private int getId(String idName){ Resources resources = getResources(); int resId = resources.getIdentifier(idName, "id", getPackageName()); return resId; }
-
获取动画id
private int getAnimId(String idName){ Resources resources = getResources(); int resId = resources.getIdentifier(idName, "anim", getPackageName()); return resId; }
-
作为一个Android开发者来说,也许你已经发现上面代码的不同点了,就是getIdentifier()里面的第二个参数的不同,我们可以通过替换这个参数来达到大部分的寻找资源id(example:id, string, anim, attr, drawable, layout, color, menu, styles...)
- 通过Java的强大的反射机制获取资源id
-
通过反射获取一个资源id
public int getAttrId(String attrName) { try { Class<?> loadClass = mContext.getClassLoader().loadClass(mContext.getPackageName() + ".R"); Class<?>[] classes = loadClass.getClasses(); for (int i = 0; i < classes.length; i++) { if (classes[i].getName().equals(mContext.getPackageName() + ".R$attr")) { Field field = classes[i].getField(attrName); int attrId = field.getInt(null); return attrId; } } } catch (Exception e) { e.printStackTrace(); } return 0; }
-
首先使用反射能达到上面的获取一个id的情况,但是比较麻烦,当需要返回一个数组我们就不得不使用这种方法了
private int[] getStyleableArryId(String styleableName){ try { Class<?> loadClass = getContext().getClassLoader().loadClass(getContext().getPackageName() + ".R"); Class<?>[] classes = loadClass.getClasses(); for(int i=0 ;i<classes.length ;i++){ Class<?> resClass = classes[i]; if(resClass.getName().equals(getContext().getPackageName() + ".R$styleable")){ Field[] fields = resClass.getFields(); for (int j = 0; j < fields.length; j++) { if(fields[j].getName().equals(styleableName)){ int[] styleable = (int[]) fields[j].get(null); return styleable; } } } } } catch (Exception e) { e.printStackTrace(); } return null; }
-
但是在设置styleable的资源id的时候,如果你是自定义的View,如果需要引入自定义的attr,比如这样:
public WheelVerticalView(Context context, final AttributeSet attrs) {
this(context, attrs, R.attr.abstractWheelViewStyle);
this(context, attrs, 0);
}