在Android中,有没有办法使用动态字符串对象来提取资源?

时间:2015-09-13 23:47:03

标签: android

我有一个拥有大量头像的项目。现在,我有20多张图片,使用微调器选择组合可供用户使用。现在,他们只需要两个微调器即可完成20种组合。随着我获得更多艺术资产,这个数字会增长。

有没有办法采取他们的选择并以编程方式从资源中选择正确的图片?

如果他们选择" sportscar"在第一个微调器和"红色"在第二个微调器上,我想采用这两个值并加载" sportscar_red.png"通过将字符串传递给下一个活动。

有没有办法做到这一点?

如果没有,是否有一些比令人作呕的巨大级联更好的事情" if / else if"声明?

编辑:避免长时间" if / else if"通过其他繁琐的硬编码手段的陈述似乎没有任何理由解决这个问题。选择二级解决方案时,我的主要优先事项是易于维护和扩展。

4 个答案:

答案 0 :(得分:1)

要从资源名称获取资源ID,没有地图,最快的方法是使用如下方法:

    private int getResourceId(@NonNull String drawableName) {
        int resourceId = -1;
        try {
            Field field = com.your.package.R.drawable.class.getField(drawableName);
            resourceId = field.getInt(null);
        } catch (Exception e) {
            // Drawable id not found
        }
        return resourceId;
    }

所以,当你有来自微调器的两个String时,只需调用:

int resId = getResourceId(string1 + "_" + string2)

这将返回您需要显示的资源ID,如果找不到,则返回-1。不需要硬编码的Map或if / else语句。

动态资源名称的其他替代方法(如Resources.getIdentifier())实际上更慢,因为它们在后面执行更多的反射调用。可以找到Daniel Lew关于这个主题的好读物here

答案 1 :(得分:0)

如果可以,我会使用HashMap,将微调器作为键,将drawable作为值。在需要时加载。

static Map<String, Integer> icons = new HashMap<String, Integer>();

static 
{
    icons.add("icon1", R.drawable.icon);
    icons.add("icon2", R.drawable.icon2);
    icons.add("icon3", R.drawable.icon3);
}

答案 2 :(得分:0)

我认为你在问题中描述它的方式已经是解决方案了。

使用每个微调器返回的值,使用StringBuilder组合它们并使用该String获取图像。

为此,您需要:
  - 具有非常强大的命名结构并坚持下去   - 使用getText不要从微调器中获取值,因为这会阻止您在应用中使用多种语言。您需要能够从String而不是字符串本身获取id值。

然后在Intent中传递字符串。没问题。

答案 3 :(得分:0)

您可以直接使用/assets文件夹代替/res并直接为您的头像加载drawable

String avatarName = firstSpinner + '_' + secondSpinner + '.png'; Drawable d = Drawable.createFromStream(getAssets().open("avatars/" + avatarName), null);