动态加载 id 和应用程序签名时不显示可绘制对象

Drawable not displayed when id is loaded dynamically and application signed

上下文

列表视图中的每个项目都加载一个图像。给定项目的数据,返回资源(可绘制)的 id。这个id在imageview的setResourceId中使用。

问题

当 apk 被签名时,没有任何显示(但是没有错误发生)。

测试

确保加载资源的正确 ID。创建了一项,其匹配资源为 R.drawable.banana,记录了函数返回的 id 以及值 R.drawable.banana(如下所示)。

int id = CropDataHelper.getCropsDrawable(myContext, txt);
Log.i("image id:"+id,"found id Fragment View Cycles");
Log.i("raw draw:"+R.drawable.banana,"drawable Fragment View Cycles");

记录的值相同,因此返回了正确的 ID。

进一步测试显示

如果直接使用资源,R.drawable.example 显示图像,即使函数 returns 具有相同的值。

id = R.drawable.banana;
...
iv.setImageResource(id);

之前失败的尝试

folder attempt reference。但是,由于图像确实显示了我是否使用 直接R参考这是无稽之谈。

使用获取到的id直接加载drawable并设置

Drawable d = ContextCompat.getDrawable(myContext,id);
...
iv.setImageDrawable(d);

实际代码片段

int id = CropDataHelper.getCropsDrawable(myContext, txt);
Log.i("image id:"+id,"found id Fragment View Cycles");
Log.i("raw draw:"+R.drawable.banana,"drawable Fragment View Cycles");
//              id = R.drawable.banana; - testing use of direct resource
//              Drawable d = ContextCompat.getDrawable(myContext,id); drawable attempt
ImageView iv = ((ImageView) row.findViewById(R.id.icon_purchaseType));
if (id != -1) {
    iv.setImageResource(id);
//                  iv.setImageDrawable(d); - drawable attempt
}

最后的备注

调试时不会出现问题,只会出现在签名的 apk 上,这让我相信 R.drawable.example 在签名的 apk 上解锁了一些基础权限但是当尝试直接使用 id 时,这些权限并未解锁。感谢任何帮助,谢谢。

变通

字符串名称到 R 的 ids

的哈希映射

推理

似乎在尝试读取文件时可能有一些权限不可用(仅出现在已签名的文件中 - 即使这些是应用程序图像)。为了解决这个问题,不是使用 json 文件按名称加载图像文件,而是使用字符串创建哈希图以匹配 R 的 ID。

示例代码

//create hashmap
private HashMap<String,Integer> resources;

//fill hash map with resources
resources.put("FIRST",R.drawable.example_img_1);
resources.put("SECOND",R.drawable.example_img_2);

//simple method to access resources
public Integer getResourceId(String key){
    if(resources.containsKey(key))
        return resources.get(key);
    return R.drawable.default_image;
}