ImageView setBackround 里面 activity 动态

ImageView setBackround inside the activity dynamically

在我的 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 变量中我有所需的级别(一、二、三) 我需要设置图像 R.drawable.leveltwo 等...

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

感谢您的帮助!

您不能将输入字符串附加到图像名称,但您可以做的是, select 基于输入字符串的图像,然后如果您有 3 个不同的图像,请尝试使用 ;

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

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

您需要将关卡与资源相关联,在本例中为 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);

现在,您可以传递一个枚举,而不是传递一个描述您当前级别的字符串,您可以使用它来确定正确的资源,而无需连接字符串。所以,假设 levelReachedLevel 类型,你可以这样写:

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

您有 2 个选择:

选项 1:

只需使用 switch-case 获取正确的可绘制对象,然后像往常一样将其设置为背景图像

// 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;作为常量或枚举。

选项 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();

不需要。

你需要做这样的事情:

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));