Android 如何根据XML文件读取drawable资源

问题提出的背景:自己在做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()");