2010-09-06 195 views
29

我该如何做到这一点:动态资源加载Android

我想找到一种方法来打开名称是在运行时只确定的资源。

让我解释更多的细节

我想有一个XML引用一堆其他的XML文件中的应用APK。

出于说明的目的,假设主XML是main.xml,其他XML是file1.xml file2.xml,fileX.xml。

我想要的是读取main.xml,提取我想要的XML名称(fileX.xml)。然后读取fileX.XML。

我所面临的问题是什么,我解压形式的main.xml是一个字符串,我无法找到一个方法来改变,要R.raw.nameOfTheFile

任何人有一个想法?

我不想:

  • 重组一切都在一个巨大的XML文件中,一些/串链接到资源ID
一个巨大的开关情况
  • 硬编码的main.xml
  • +0

    我面临类似的问题,但我没有得到任何接受的答案。任何人都可以为这个问题开始赏金吗? – 2013-08-30 08:48:22

    回答

    51

    我还没有原始文件或XML布局文件中使用它,但可绘我用这个:

    getResources().getIdentifier("fileX", "drawable","com.yourapppackage.www"); 
    

    获取资源的标识符(R.id)。您需要用其他东西替换drawable,可能是rawlayout(未经测试)。

    +0

    非常感谢您的答案。对于那些在同一个案例[这里是关于这个问题的一个很好的解释](http://www.anddev.org/tinytut_-_get_resources_by_name__getidentifier_-t460.html)(一旦我有了这个函数的名字,它很简单):' getResources()。getIdentifier(“fileX”,“raw”,应用程序包);' – 2010-09-06 05:22:06

    +1

    Dead link? @JasonRogers啊,nvm - 它应该是http://www.anddev.org/tinytut_-get_resources_by_name__getidentifier-t460.html – aaronsnoswell 2012-07-20 02:31:12

    +1

    不是没有死链接casperOne删除我的帖子,并将其更改为一条评论,没有花时间做正确的(又名断链接)这里是链接:http://www.anddev.org/tinytut_-_get_resources_by_name__getidentifier_-t460.html – 2012-07-20 10:53:34

    23

    我写了这方便的小助手方法来封装此:

    public static String getResourceString(String name, Context context) { 
        int nameResourceID = context.getResources().getIdentifier(name, "string", context.getApplicationInfo().packageName); 
        if (nameResourceID == 0) { 
         throw new IllegalArgumentException("No resource string found with name " + name); 
        } else { 
         return context.getString(nameResourceID); 
        } 
    } 
    
    +0

    非常有用,谢谢,但我们永远不会想要一个字符串。有时候一条小溪会更好。 – 2011-12-23 00:31:13

    6

    还有另一种方法:

    int drawableId = R.drawable.class.getField("file1").getInt(null); 
    

    根据this blog它比使用则getIdentifier快5倍倍。