如何通过变量获取Drawable资源为AlertDialog设置动态图标
如何根据等级动态设置AlertDialog的图标?
嘿,你的思路方向是对的,但直接用字符串拼接出来的icon_var去引用R.drawable.icon_var是行不通的——因为R.drawable里的每个图标对应的都是编译时生成的int类型资源ID,不是字符串变量。下面给你两种实用的实现方式:
方法一:Switch-Case匹配(适合等级数量少的场景)
这种方式直观易懂,性能也更好,适合等级不多的情况:
// 获取当前等级 int level = OEDPrefs.level_number(); int iconResId; // 根据等级匹配对应的图标资源ID switch (level) { case 1: iconResId = R.drawable.icon1; break; case 2: iconResId = R.drawable.icon2; break; case 3: iconResId = R.drawable.icon3; break; // 继续添加其他等级的case default: // 默认图标,当等级不匹配时使用 iconResId = R.drawable.icon; break; } // 创建AlertDialog并设置图标 AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Level" + level); alert.setIcon(iconResId); // 后续可以添加其他设置,比如setMessage、setPositiveButton等
方法二:通过资源名动态获取ID(适合等级数量多的场景)
如果你的等级很多,不想写一堆switch-case,可以用getResources().getIdentifier()通过资源名称动态获取ID:
int level = OEDPrefs.level_number(); // 拼接图标资源名 String iconName = "icon" + level; // 根据资源名获取对应的drawable资源ID // 参数分别是:资源名、资源类型(这里是drawable)、应用包名 int iconResId = getResources().getIdentifier(iconName, "drawable", getPackageName()); // 一定要检查资源是否存在,避免找不到资源时返回0导致崩溃 if (iconResId == 0) { iconResId = R.drawable.icon; // 用默认图标兜底 } // 创建AlertDialog并设置图标 AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Level" + level); alert.setIcon(iconResId);
注意事项:
- 使用第二种方法时,要确保你的
drawable文件夹里确实存在icon1、icon2、icon3...这些命名的图标文件,否则getIdentifier()会返回0,这时候一定要用默认图标兜底,避免崩溃。 - 从性能角度来说,Switch-Case的方式更优,因为是直接引用编译好的常量,不需要运行时查找资源;如果等级数量不多,优先选这种方式。
内容的提问来源于stack exchange,提问作者timothepoznanski
相关产品推荐
相关产品推荐

