日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发之SDK开发获取资源id报错的问题

發(fā)布時間:2023/12/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发之SDK开发获取资源id报错的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們在開發(fā)SDK的時候有時候需要兼容Eclipse版本和AS版本,AS版本就不說了沒多大問題,主要是Eclipse版本會有問題。當開發(fā)之使用Eclipse開發(fā)的時候接入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數(shù)組資源下的子資源,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报错的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。