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);
现在,您可以传递一个枚举,而不是传递一个描述您当前级别的字符串,您可以使用它来确定正确的资源,而无需连接字符串。所以,假设 levelReached
是 Level
类型,你可以这样写:
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));
在我的 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);
现在,您可以传递一个枚举,而不是传递一个描述您当前级别的字符串,您可以使用它来确定正确的资源,而无需连接字符串。所以,假设 levelReached
是 Level
类型,你可以这样写:
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));