You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 16:18:01