我们在开发SDK的时候有时候需要兼容Eclipse版本和AS版本,AS版本就不说了没多大问题,主要是Eclipse版本会有问题。当开发之使用Eclipse开发的时候接入jar包(AS打包成aar,解压获取Jar)的时候会报错资源id找不到,这是因为aar里面的资源id生成了唯一的int值,但是单独将aar解压拿出jar,去找id的值的时候会找不到的,解决办法有:

利用反射:工具类已封装好

package com.mchsdk.paysdk.utils;import android.content.Context;
import android.content.res.Resources;import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;public class MCHInflaterUtils {private static final String TAG = "MCHInflaterUtils";/*** 获取布局文件** @param con*            上下文* @param layoutName*            布局文件名称* @return*/public static int getLayout(Context con, String layoutName) {return getIdByName(con, "layout", layoutName);}/*** 获取控件** @param con*            上下文* @param controlName*            控件名称* @return*/public static int getControl(Context con, String controlName) {return getIdByName(con, "id", controlName);}/*** 获取资源文件** @param con*            上下文* @param drawableName*            资源名称* @return*/public static int getDrawable(Context con, String drawableName) {return getIdByName(con, "drawable", drawableName);}/*** Refer to external project resources** @param context* @param className* @param name* @return*/private static int getIdByName1(Context context, String className,String name) {String packageName = null;Class<?> r = null;int id = 0;try {packageName = context.getPackageName();//MCLog.w(TAG, "packageName:"+packageName);r = Class.forName(packageName + ".R");Class<?>[] classes = r.getClasses();Class<?> desireClass = null;for (int i = 0; i < classes.length; ++i) {if (classes[i].getName().split("\\$")[1].equals(className)) {desireClass = classes[i];break;}}if (desireClass != null) {id = desireClass.getField(name).getInt(desireClass);}} catch (ClassNotFoundException e) {System.out.println("getIdByName1 ClassNotFoundException");} catch (IllegalArgumentException e) {System.out.println("getIdByName1 IllegalArgumentException");} catch (SecurityException e) {System.out.println("getIdByName1 SecurityException");} catch (IllegalAccessException e) {System.out.println("getIdByName1 IllegalAccessException");} catch (NoSuchFieldException e) {System.out.println("getIdByName1 NoSuchFieldException");} catch (Exception e) {e.printStackTrace();}return id;}private static int getIdByName2(Context context, String className,String name) {Resources res = null;int id = 0;try {res = context.getResources();id = res.getIdentifier(name, className, context.getPackageName());} catch (Exception e) {e.printStackTrace();}return id;}/**** @param context*            上下文* @param className*            类名* @param name*            属性名* @return*/public static int getIdByName(Context context, String className, String name) {int id = -1;int id1 = getIdByName1(context, className, name);int id2 = getIdByName2(context, className, name);if (id2 != 1 && id2 != 0) {id = id2;}else if (id1 != 0) {id = id1;}else {MCLog.e(TAG, "存在SDK找不到的资源文件:"+"className:"+className+";   name:"+name);}return id;}public static int[] getStyleableIntArray(Context context, String name) {try {Field[] fields = Class.forName(context.getPackageName() + ".R$styleable").getFields();//.与$ difference,$表示R的子类for (Field field : fields) {if (field.getName().equals(name)) {int ret[] = (int[]) field.get(null);return ret;}}} catch (Throwable e) {e.printStackTrace();}return null;}/*** 遍历R类得到styleable数组资源下的子资源,1.先找到R类下的styleable子类,2.遍历styleable类获得字段值** @param context* @param styleableName* @param styleableFieldName* @return*/public static int getStyleableFieldId(Context context, String styleableName, String styleableFieldName) {String className = context.getPackageName() + ".R";String type = "styleable";String name = styleableName + "_" + styleableFieldName;try {Class<?> cla = Class.forName(className);for (Class<?> childClass : cla.getClasses()) {String simpleName = childClass.getSimpleName();if (simpleName.equals(type)) {for (Field field : childClass.getFields()) {String fieldName = field.getName();if (fieldName.equals(name)) {return (int) field.get(null);}}}}} catch (Throwable e) {e.printStackTrace();}return 0;}/**** @param context* @param type* @param name* @return*/public static Object getResourceData(Context context, String type, String name) {try {Class<?> arrayClass = getResourceClass(context, type).getClass();Field intField = arrayClass.getField(name);return intField.get(arrayClass);} catch (Exception e) {e.printStackTrace();}return null;}private static HashMap<String, Object> ResourceClass = new HashMap<String, Object>();private static Object getResourceClass(Context context, String type) {if (ResourceClass.containsKey(type)) {return ResourceClass.get(type);} else {try {Class<?> resource = Class.forName(context.getPackageName() + ".R");Class<?>[] classes = resource.getClasses();for (Class<?> c : classes) {int i = c.getModifiers();String className = c.getName();String s = Modifier.toString(i);if (s.contains("static") && className.contains(type)) {ResourceClass.put(type, c.getConstructor().newInstance());return ResourceClass.get(type);} else {continue;}}} catch (Exception e) {e.printStackTrace();}}return null;}
}

调用方法如下:

设置布局setContentView(MCHInflaterUtils.getLayout(ToCertificateActivity.this, "activity_mch_certificate"));
获取idTextView txtTitle = (TextView) findViewById(MCHInflaterUtils.getControl(this, "tv_mch_header_title"));
获取drawable
MCHInflaterUtils.getDrawable(activity, "normal_login_bt_bg")

Android开发之SDK开发获取资源id报错的问题相关推荐

  1. Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)

    咱们先看下报错结果图: 我这边是华为荣耀7i手机才出现这个情况,总结得出结论android6.0以上加载自定义scheme会报错如下,6.0以下貌似不会 三星和模拟器没有可以直接加载这个url ,网页 ...

  2. iOS开发之SDK开发

    转自 https://www.jianshu.com/p/cbb1f54b89d2 内容提要:不同场景下如何封装及开发SDK .a静态库创建 直接创建Framework库 在已有工程中创建 创建Fra ...

  3. 软件开发之SDK开发

    1.SDK与API的区别? SDK包含了API所必须的资料,又提供了一些额外的帮助,目的是为了服务调用方更加方便地调用所需服务.比如,我们现在需要编程,那么电脑就是我们编程所需要地API(applic ...

  4. qt android 开发之wifi开发篇

    小编简单介绍如何通过调用android API来获取wifi服务( 非常感谢作者安晓辉发布了qt android 核心编程这本书,让我两天搞懂了很多在qt中开发安卓的要领,现在跟大家分享下!至于还没知 ...

  5. Android开发之assets目录下资源使用总结

    预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问 ...

  6. Android开发之Fmod开发引擎库-----变声

    最近接到一个项目需求,大概是围绕***变声***这个功能展开的. 我从来没有写过这样的项目,抱着好奇的心态百度了一番,找到了一个是为游戏开发者准备的革命性音频引擎------FMOD开发引擎库. 1. ...

  7. Android开发之EditText无法获取光标的问题

    老套路看图: 在上图红包个数那里是个EditText控件,当我删除数字后光标就无法显示了,看下我的xml写法: <EditTextandroid:id="@+id/et_red_num ...

  8. android 指定资源id,Android 通过名称获取资源ID

    当我们获取网络数据的时候,解析之后往往都是一个字符串,而不是资源id,所有我们没有办法直接使用,只能通过名称来获取到资源id, package com.example.administrator.de ...

  9. android studio输入框下划线,Android开发之TextView的下划线添加

    Android开发之TextView高级应用 Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大 ...

最新文章

  1. KVM — virsh 指令行工具
  2. python学习与数据挖掘_Python学习之数据挖掘(三)
  3. 对象流java_Java中的对象流总结(必看篇)
  4. opencv配置中常见问题
  5. python 直播源地址_如何获取视频的直播源地址
  6. Redis 清空数据库
  7. Cisco Packet Tracer教程
  8. 遏制流氓软件的方法:禁止360的sesvc.exe在后台运行
  9. 微信与企业微信消息如何互通?
  10. 大疆aeb连拍_给无人机新手的3个航拍技巧,入门机也能拍大片!
  11. 【应用随机过程】03. 马尔可夫链的状态
  12. 爬虫中常见的反爬手段和解决方法
  13. 癌症的征兆(不看后悔)
  14. 气象期刊参考文献样式
  15. QQ登录 110401:请求的应用不存在
  16. Linux下C++编程基础
  17. 关于交大教务网的掌上事务管理中心(服务外包大赛初审)一:概况
  18. jpg,gif和png三种格式图片的说明
  19. XSS平台搭建(xsser.me)
  20. python 时间戳转iso 8601_关于datetime:Python中的ISO时间(ISO 8601)

热门文章

  1. 基于计算机的控制系统,基于计算机的机械控制系统实现方式研究.pdf
  2. zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题
  3. java 静态方法_新手学Java,哪些知识点可以优先掌握?
  4. mysql inodb主键bug_MySQL的这个bug,坑了多少人?
  5. 火狐浏览器打印网页不全_武汉社保网上下载打印流程
  6. iOS---------关于野指针定位总结
  7. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍
  8. flask之jinji2模板介绍
  9. Software-testing-foundations-homework3
  10. Java 单测 回滚