1.下笔缘由
在一次开发中,自己打的模块dex包无法调用res资源,所以在这里做一下总结。通过反射dex包可以调用指定包名下的资源文件。所以可以通过将子模块所调用到的资源放到主项目中,然后通过反射获取主项目下res的资源,当然jar包也可以通过反射获取指定包名下res的资源文件。
2.例子解析
从上面的图中我们可以看到,res下有layout,value,drawale等(这里研究的是eclipse下的Android项目,AndroidStudio的还没试过,大家可以去测试一下)我们主要通过Context.getResources().getIdentifier()方法获取对于的资源文件的ID.
Context.getResources().getIdentifier("资源的名称","资源的类型","该资源所在项目的包名")
1)获取layout文件id
例如:我们要获取主项目LGYtest资源文件layout下的test_layout.xml布局文件的id.如下图:
然后再看这个LGYtest项目的包名
接下来我们就可以通过上下文context获取资源的id了
context.getResources().getIdentifier("test_layout","layout",context.getPackageName())
//当然,你也可以直接如下,但是这样不可重复利用,只能是com.example.lgytest包名的项目才能调用这个jar或dex包了。
context.getResources().getIdentifier("test_layout","layout","com.example.lgytest")
2)获取value下string.xml文件下的字符串id
例如:我要获取string.xml下的app_name的字符串
context.getResources().getIdentifier("app_name","string",context.getPackageName())
3)获取value下style.xml文件下的某个样式的id
例如:我要获取一个名为"dialog_style"的样式
context.getResources().getIdentifier("dialog_style","style",context.getPackageName())
4)获取drawable文件夹下的图片或xml的id
例如:获取名为“ic_launcher”的图片
context.getResources().getIdentifier("ic_launcher","drawable",context.getPackageName())
除了这个图片,animation-list也是可以通过反射获取的,例如:我要获取名为"anim_loading"的animation-list的xml文件(这个xml文件我放在drawable文件夹下)
context.getResources().getIdentifier("anim_loading","drawable",context.getPackageName())
5)获取res文件夹下的color.xml文件下某个颜色字段的id
例如:我要获取color.xml文件里名为“yellow”的id
context.getResources().getIdentifier("yellow","color",context.getPackageName())
6)获取res文件夹下的array.xml文件下某个字段的id
例如:我要获取array.xml文件里名为“my_array”的id
context.getResources().getIdentifier("my_array","array",context.getPackageName())
3.总结
猜测Android Studio也是可以通过context.getResources().getIdentifier获取资源id的,当然还是要去测试过才知道。
4.参考文章
这篇文章解释得很好,还做了一个工具类