动态内的ImageView setBackround动态

时间:2015-03-28 17:34:35

标签: java android android-layout android-imageview

在我的drawabale文件夹中,我有这些图像:levelone,leveltwo,level three。

我需要根据输入的字符串设置ImageView,如下所示:

    levelindicatorImageView = (ImageView) findViewById(R.id.levelindicatorImageView);

    String tempo="R.drawable.level"+LevelReached;
    Drawable replacer = getResources().getDrawable(tempo);
    int sdk = android.os.Build.VERSION.SDK_INT;
    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        levelindicatorImageView.setBackgroundDrawable(replacer);
    } else {
        levelindicatorImageView.setBackground(replacer);
    }
    levelindicatorImageView.invalidate();

现在在LevelReached变量中我有所需的级别(一,二,三) 我需要设置Image R.drawable.leveltwo等......

请问怎么可能? 因为getDrawable不适用于速度(需要int)

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您有两个选择:

选项1:

只需使用开关盒即可获得正确的可绘制,然后像往常一样将其设置为背景图像

// Get the level drawable resource id
int imageRes = R.drawable.default_image;
switch (levelReached) {
    case LEVEL_ONE: // 1
        imageRes = R.drawable.level_one;
        break;
    case LEVEL_TWO: // 2
        imageRes = R.drawable.level_two;
        break;
    ...
}

// Set the drawable as a background
levelIndicatorImageView.setBackgroundResource(imageRes);

LEVEL_ONE == 1; LEVEL_TWO == 2; as const或enum。

选项2:

您可以按名称找到可绘制资源(如您所愿),但不建议使用它,因为它更多是错误修剪。但如果必须,请使用以下示例:

// Get the level drawable resource id
int imageRes = getResources().getIdentifier("level"+levelReached, "drawable", getPackageName());

// Set the drawable as a background
levelIndicatorImageView.setBackgroundResource(imageRes);

注意:

如果设置背景,则不需要显式使视图无效,因为设置新背景会自动触发失效。所以,这一行:

levelindicatorImageView.invalidate();

不需要。

答案 1 :(得分:0)

您无法将输入字符串附加到图像名称,但您可以执行的操作是, 根据输入字符串选择图像然后如果您有3个不同的图像,请尝试使用;

if(input.equalsIgnoreCase("input one"))
{
   int id = R.drawable.<img one>;
}
else
{
   //so on
}

levelindicatorImageView.setBackground(getResources().getDrawable( id) );

答案 2 :(得分:0)

您需要将关卡与资源相关联,在本例中为int。这样做的惯用方法是将级别存储为枚举,比如说

enum Level { ONE, TWO, THREE }

以这种方式使用枚举可以让您灵活地使用级别约定。例如,如果您以后想要添加级别TWO_THIRDS,则没有什么可以阻止您。然后,将每个级别与EnumMap中的资源相关联,例如:

Map<Level, Integer> levelResources = new EnumMap<Level, Integer>(Level.class);

levelResources.put(ONE, R.drawable.levelOne);
levelResources.put(TWO, R.drawable.levelTwo);
levelResources.put(THREE, R.drawable.levelThree);

现在,您可以传递枚举,而不是传递描述当前级别的字符串,您可以使用它来确定正确的资源而不连接字符串。因此,假设levelReached的类型为Level,您可以写:

Integer tempo = levelResources.get(levelReached);
Drawable replacer = getResources().getDrawable(tempo);

答案 3 :(得分:0)

你需要做这样的事情:

public int getResourecId(String level) {
    if(level.equalsIgnoreCase("one"))
        return R.drawable.levelone;
    if(level.equalsIgnoreCase("two"))
        return R.drawable.leveltwo;
    if(level.equalsIgnoreCase("three"))
        return R.drawable.levelthree;
    return 0;
}

然后:

Drawable replacer = getResources().getDrawable(getResourceId(LevelReached));