我有一个拥有大量头像的项目。现在,我有20多张图片,使用微调器选择组合可供用户使用。现在,他们只需要两个微调器即可完成20种组合。随着我获得更多艺术资产,这个数字会增长。
有没有办法采取他们的选择并以编程方式从资源中选择正确的图片?
如果他们选择" sportscar"在第一个微调器和"红色"在第二个微调器上,我想采用这两个值并加载" sportscar_red.png"通过将字符串传递给下一个活动。
有没有办法做到这一点?
如果没有,是否有一些比令人作呕的巨大级联更好的事情" if / else if"声明?
编辑:避免长时间" if / else if"通过其他繁琐的硬编码手段的陈述似乎没有任何理由解决这个问题。选择二级解决方案时,我的主要优先事项是易于维护和扩展。
答案 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);