动态加载 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);
之前失败的尝试
- 将资源放入不同的文件夹(无 dpi 等)
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;
}
上下文
列表视图中的每个项目都加载一个图像。给定项目的数据,返回资源(可绘制)的 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);
之前失败的尝试
- 将资源放入不同的文件夹(无 dpi 等)
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;
}