【问题标题】:Android - Getting a list of drawable resourceAndroid - 获取可绘制资源的列表
【发布时间】:2011-07-14 08:16:09
【问题描述】:

在 android 中,您可以使用 R.. 等语法访问资源

我想要做的是达到一组图像具有命名约定。

例如,我有 4 个名称为可绘制的文件:

draw_1_.jpg

我怎样才能得到可绘制图像列表到 List ..

这是因为,我想制作幻灯片。

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    我不相信您可以相信资源编译器会为您的图像提供顺序整数值。过去我总是创建一个静态数组来存储这些。

    private static int[] imgs = { R.id.draw_1, R.id.draw_2, R.id.draw_3, R.id.draw_4 };
    

    有了这个,你就可以有一段代码,比如:

    int curSlide = 0;
    view.setBackgroundResource(imgs[curSlide]);
    

    【讨论】:

    • 在上面的评论中(我添加到第一个答案中的那个)我的意思是这种方法。
    • 我决定使用静态资源访问方式。我认为这足以满足我的要求。我最多需要显示 10 张图片。
    【解决方案2】:

    虽然这是一个老问题,但我最近也遇到了类似的问题。我喜欢 jeffd 的解决方案,但是在代码中存储图像 ID 列表并不是最好的主意。所以,我用列表创建了一个 xml 文件,我把它放在 res/xml 目录中。

    <?xml version="1.0" encoding="utf-8"?>
    <list>
        <image id="@drawable/draw_1"/>
        <image id="@drawable/draw_2"/>
        <image id="@drawable/draw_3"/>
        <image id="@drawable/draw_4"/>
    </list>
    

    图片存储在drawable目录下,命名为draw_1.jpgdraw_2.jpg

    使用这种 xml 的一个优点是在编译时检查资源的可用性,所以如果你有错别字,它不会编译。

    在代码中检索列表只是解析 xml,但它有点冗长。 XmlPullParser 有方法 getAttributeResourceValue 允许在不处理任何字符串的情况下获取资源 id。

    List<Integer> list = new ArrayList<>();
    try {
        while (parser.next() != XmlPullParser.END_DOCUMENT) {
            if (parser.getEventType() == XmlPullParser.START_TAG &&
                parser.getName().equals("image")) {
    
                int imageId = -1;
                for (int i = 0; i < parser.getAttributeCount(); ++i) {
                    if (parser.getAttributeName(i).equals("id")) {
                        list.add(parser.getAttributeResourceValue(i, -1));
                    }
                }
            }
        }
    }
    catch (XmlPullParserException | IOException e) {
        e.printStackTrace();
    }
    

    另一个更简单的解决方案是使用数组作为资源。我还没有尝试过,但是您可以在这里看到一个示例:http://www.geeks.gallery/how-to-list-images-from-array-xml-in-android/ 这是构建 xml 的方法:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <array name="list">
            <item>@drawable/draw_1</item>
            <item>@drawable/draw_2</item>
            <item>@drawable/draw_3</item>
        </array>
    </resources>
    

    要访问数组,您可以使用以下代码:

    TypedArray list = getResources().obtainTypedArray(R.array.list);
    for (int i = 0; i < list.length(); ++i) {
        int id = list.getResourceId(i, -1);
    }
    

    【讨论】:

      【解决方案3】:

      好吧,如果您知道图像的后缀,您可以通过getResources().getIdentifier(...) 请求可绘制对象的标识符,然后使用标识符获取可绘制对象。所以如果你知道你有多少张图片,那么你可以创建一个循环并将每个可绘制对象存储在一个列表中。只需考虑到这样的查找相对昂贵。

      【讨论】:

      • 这是一个很好的方法,但正如你所说,对我来说可能很昂贵。我想我会在每次升级时更新代码。
      • 是的,您可能希望进行一次这样的查找,而不是每次绘制调用,因此要么在初始化时存储 ID,要么存储可绘制对象本身。
      【解决方案4】:

      你应该将所有的 Image 识别为 Drawable .. 然后你就可以使用它们了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 2015-04-29
        • 1970-01-01
        • 2020-05-04
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多