在 封装框架 编译jar文件中 有一个 应用场景,在不引入 包名的情况下 获取资源文件的 id
为什么 不能引入包名呢? 因为 如果在jar文件中 使用了 例如以下代码
setContentView(R.layout.activity_main);
就会 自动导入一个 已app包名为路径 的 一个名字为R的 类
import com.demo.po.R;
如果 android 的项目工程 没有这样的包名 或者module 自然就会报错了 (找不到 R文件)
回到正题 如何 解决呢?直接上 硬菜
/**
* 获取资源在r文件中的标示
*
* @param context
* @param resName
* @param resType
* @return
*/
public static int getIndentifier(Context context, String resName,
String resType) {
return context.getResources().getIdentifier(resName, resType,
context.getPackageName());
}
public static int getLayoutIndentifier(Context context, String layoutName) {
return getIndentifier(context, layoutName, "layout");
}
public static int getIDIndentifier(Context context, String idName) {
return getIndentifier(context, idName, "id");
}
public static int getStyleIdentifier(Context context, String styleName) {
return getIndentifier(context, styleName, "style");
}
public static int getDrawableIdentifier(Context context, String drawableName) {
return getIndentifier(context, drawableName, "drawable");
}
public static int getStringIdentifier(Context context, String drawableName) {
return getIndentifier(context, drawableName, "string");
}
补充 另外一种方式:反射
/*
*@parama variableName 例如: drawable;string
*@param clas 例如:R.drawable.class;R.string.class
*
* */
public int getResId(String variableName, Class<?> clas) {
try {
Field idField = clas.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}