Android 反射调用资源和id
来源:互联网 发布:多人通话软件 编辑:程序博客网 时间:2024/06/01 08:55
本文介绍利用反射调用资源和id
提出问题:
app有一种叫应用墙的广告,应用墙是在你的程序中弹出一个Activity来展示广告,比如豌豆广点通等,集成的时候需要将资源通过复制添加到自己的项目中,但是app墙的代码是封装好的jar代码。不是源码,看不到,也不能修改。那么jar中的代码是如何加载本地资源的呢?
自己的项目中加载资源的时候都是通过本项目的R文件来初始化资源,R文件是你自己的项目的R文件,和项目有关,如果第三方的jar文件中使用的R是来第三方SDK项目中的资源R,代码更换了项目之后铁定了是找不到你复制过来的资源的。那么这时候就需要通过特殊的方式来加载资源了,以便于调用在被集成的app中的资源。
通过原始的java反射机制的方式调用资源:
这只是一种方式,还有其他的方式。
IDHelper.java
public class IDHelper {public static int getLayout(Context mContext, String layoutName) {return ResourceHelper.getInstance(mContext).getLayoutId(layoutName);}public static int getViewID(Context mContext, String IDName) {return ResourceHelper.getInstance(mContext).getId(IDName);}public static int getDrawable(Context context, String drawableName) {return ResourceHelper.getInstance(context).getDrawableId(drawableName);}public static int getAttr(Context context, String attrName) {return ResourceHelper.getInstance(context).getAttrId(attrName);}public static int getString(Context context, String stringName) {return ResourceHelper.getInstance(context).getStringId(stringName);}}
public class ResourceHelper {private static ResourceHelper mResource = null;private static String mPackagename = null;private static Class<?> mLayout = null;private static Class<?> mDrawable = null;private static Class<?> mID = null;private static Class<?> mString = null;private static Class<?> mAttr = null;public static ResourceHelper getInstance(Context context) {if (mResource == null) {mPackagename = (mPackagename == null ? context.getPackageName(): mPackagename);mResource = new ResourceHelper(mPackagename);}return mResource;}public ResourceHelper(String packageName) {try {mLayout = Class.forName(packageName + ".R$layout");} catch (ClassNotFoundException e) {e.printStackTrace();}try {mDrawable = Class.forName(packageName + ".R$drawable");} catch (ClassNotFoundException e) {e.printStackTrace();}try {mID = Class.forName(packageName + ".R$id");} catch (ClassNotFoundException e) {e.printStackTrace();}try {mString = Class.forName(packageName + ".R$string");} catch (ClassNotFoundException e) {e.printStackTrace();}try {mAttr = Class.forName(packageName + ".R$attr");} catch (ClassNotFoundException e) {e.printStackTrace();}}private int getResourceId(Class<?> classType, String resourceName) {if (classType == null) {throw new IllegalArgumentException("ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have "+ mPackagename+ ".R$* configured in obfuscation. field="+ resourceName);}try {Field field = classType.getField(resourceName);return field.getInt(resourceName);} catch (Exception e) {e.printStackTrace();Log.e("ResourceHelper","Error getting resource. Make sure you have copied all resources (res/) from SDK to your project.");}return -1;}//public int getDrawableId(String resourceName) {return getResourceId(mDrawable, resourceName);}public int getLayoutId(String resourceName) {return getResourceId(mLayout, resourceName);}public int getId(String resourceName) {return getResourceId(mID, resourceName);}public int getStringId(String resourceName) {return getResourceId(mString, resourceName);}public int getAttrId(String resourceName) {return getResourceId(mAttr, resourceName);}}
使用:
使用的时候不需要通过R来调用资源
public class MainActivity extends ActionBarActivity {private Button mButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(IDHelper.getLayout(getApplicationContext(),"activity_main"));//字符串是layout文件的名字initView();}private void initView() {mButton = (Button) findViewById(IDHelper.getViewID(getApplicationContext(), "button1"));mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Toast.makeText(getApplicationContext(), "HelloWorld",Toast.LENGTH_LONG).show();//字符串是控件的id}});}}
通过Android API 的通过反射获取id的方法
Context.getResources().getIdentifier("activity_main", "layout", paramContext.getPackageName());
0 0
- Android 反射调用资源和id
- Android:资源 id 及资源 id 的动态获取和反射获取
- Android中通过反射获取资源Id
- Android中通过反射获取资源Id
- Android通过反射动态获取资源Id
- Android中通过反射获取资源Id
- Android利用资源名称获取其ID(二)--->反射
- Android下反射读取资源id的api
- Android反射获取资源 id通用工具类
- android通过反射获取资源ID的工具类
- android 反射机制和反射调用方法
- 用反射获取资源id
- unity调用android找不到资源“Resource ID #0x7f020001”
- unity调用android找不到资源“Resource ID #0x7f020001”
- Android中使用反射通过资源名字找到资源ID的方法
- android 资源ID规则
- Android 资源id定义
- R类反射混淆,找不到资源ID
- 汇编语言子函数——显示字符串
- Android Margin, Padding, Gravity属性用法
- iOS 企业版打包
- NSArray的遍历方法:四种
- linux中用date命令获取昨天、明天或多天前后的日期
- Android 反射调用资源和id
- 黑马程序员_多线程
- java自带线程池和队列详细讲解
- Windows消息传递机制
- 前端数据之美 -- 基础篇
- Linux信号(signal) 机制分析
- JS各种iframe弹出控件没有滚动条或者失灵的解决办法
- geotif格式的波段描述信息探究
- AM3517 WINCE7 capturetest APP 获得摄像头设备信息