Android Studio Java如何动态访问res/values下的整数数组资源
问题原因
你原代码失效的核心原因是:Resources.getIntArray() 仅接收编译时生成的整型资源ID作为入参,你拼接得到的"R.array.nutX"是普通字符串,无法直接映射为对应的资源ID。
可行解决方案
使用Android Resources 类提供的getIdentifier()方法,通过资源名称、资源类型、应用包名三个参数动态查询得到对应的资源ID,再用这个ID获取数组即可,示例实现如下:
public int getNutrientInfo(int foodNo, int nutType){ Resources r = ctx.getResources(); // 动态获取资源ID int resId = r.getIdentifier("nut" + foodNo, "array", ctx.getPackageName()); // 兜底处理:找不到对应资源时返回默认值,避免崩溃 if (resId == 0) { return -1; } int[] testy = r.getIntArray(resId); // 额外兜底:避免nutType下标越界 if (nutType < 0 || nutType >= testy.length) { return -1; } return testy[nutType]; }
优化建议
如果你的nut数组数量固定且不多,更推荐提前把所有数组的资源ID预存在静态数组中,避免频繁调用getIdentifier()带来的性能损耗(该方法底层通过反射查询资源表,性能低于静态引用),示例如下:
// 提前初始化所有nut数组的资源ID,仅执行一次 private static final int[] NUT_RES_IDS = { R.array.nut1, R.array.nut2, R.array.nut3 // 有更多数组可按顺序追加 }; public int getNutrientInfo(int foodNo, int nutType){ // 校验foodNo合法性(注意foodNo从1开始,数组下标从0开始,需要减1) if (foodNo < 1 || foodNo > NUT_RES_IDS.length) { return -1; } int[] testy = ctx.getResources().getIntArray(NUT_RES_IDS[foodNo - 1]); return nutType >= 0 && nutType < testy.length ? testy[nutType] : -1; }
内容的提问来源于stack exchange,提问作者Ni Ho
相关产品推荐
相关产品推荐

