问题提出的背景:自己在做launcher的新功能,摇一摇切换壁纸的时候。需要动态获取壁纸的id,然后填充到布局上。这样在后期维护的时候,就不需要过多的改动代码,直接增减图片,以及在配置文件(wallpapers.xml)中修改就好了。
- 第一种做法
在XML文件中声明资源ID数组
<array name = "drawer_icon_normal">
<item>@drawable/ic_drawer_home_normal</item>
<item>@drawable/ic_drawer_follow_normal</item>
<item>@drawable/ic_drawer_collect_normal</item>
<item>@drawable/ic_drawer_register_normal</item>
<item>@drawable/ic_drawer_explore_normal</item>
</array>
然后要获取ID需要通过TypedArray来获取。
TypedArray array = context.getResources().obtainTypedArray(R.array.drawer_icon_normal);
for (int i = 0; i < array.length(); i++) {
drawables_normal[i] = array.getResourceId(i$, R.drawable.default_profile);//后面的drawable文件是找不到资源加载的的文件
}
array.recycle();
- 第二种做法
xml文件中声明有所不同。没有了@drawable,所以在获取图片名字的时候,直接是名字,而不是路径。
<array name = "drawer_icon_normal">
<item>ic_drawer_home_normal</item>
<item>ic_drawer_follow_normal</item>
<item>ic_drawer_collect_normal</item>
<item>ic_drawer_register_normal</item>
<item>ic_drawer_explore_normal</item>
</array>
然后获取Id的方法如下:
获取图片的文件名的方法:
String[] extras = getContext.getResources().getStringArray(R.array.drawer_icon_normal);
packageName的获取方法:
getContext.getResources().getResourcesPackageName(R.array.drawer_icon_normal);
int resId = getContext().getResources().getIdentifier("图片的文件名","文件的类型,如drawable","文件的packageName 一般为getContext.getPackageName()");