【问题标题】:Android - getResources().getIdentifier replacementAndroid - getResources().getIdentifier 替换
【发布时间】:2023-02-01 18:36:49
【问题描述】:

在 android 中,我循环遍历数据库并分配文本和图像:

Cursor res = myDb.getAllData();

while (res.moveToNext()) {
    Actors actor = new Actors();
    actor.setName(res.getString(1));

    String th =  res.getString(11);
    Integer thumb = this.getResources().getIdentifier(th, "drawable", "mypackage");

    actor.setThumb(R.drawable.th);
}

然而,Lint 建议不要使用 getIdentifier - 不鼓励使用此函数,因为资源反射使得执行代码的构建优化和编译时验证变得更加困难。

在数据库列中,我只有图像名称(字符串)。如何替换 getIdentifier?

即使我可能将 DB 列直接更改为 R.drawable.imagename,它仍然是一个字符串,对于 setThumb,我需要一个可绘制对象。

【问题讨论】:

  • 有多少张图片?您可以使用 switch 语句,或构建和缓存字符串到标识符值的 Map<String, Integer> 并使用它。
  • 大约有200张图片。它们都在 drawable 文件夹中,我只想根据它们在数据库中的名称列出它们。我知道我也可以使用 Picasso 库,但不需要额外的库。目前,getIdentifier 效果很好,但正如我提到的,不建议使用。
  • 我相信是时候将数据库从字符串迁移到整数作为第一步了;那么一切都会很简单
  • 数据库列中的整数是什么?我需要那里的图像名称。即使你在数据库中有一个整数,你也不能在代码中动态地使用它作为可绘制对象,因为可绘制对象是可绘制的,除非你将可绘制对象 ID 存储在数据库中,我不知道所有 200 张图像,并且会更多未来
  • 您可以将可绘制对象存储到 XML 数组或什至 java 数组中(与循环的顺序相同);并将该整数(每个可绘制顺序)而不是字符串存储到数据库中。

标签: android


【解决方案1】:

好的,所以我找到的唯一解决方案就在这里https://stackoverflow.com/a/4428288/1345089

public static int getResId(String resName, Class<?> c) {

        try {
            Field idField = c.getDeclaredField(resName);
            return idField.getInt(idField);
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } 
    }

然后只是打电话:

int resID = getResId("icon", R.drawable.class);

这非常有效,但一些用户报告说,从 Play 商店安装应用程序后,一段时间后它会开始抛出 NoSuchFieldException,因为更多资源映射到相同的类/字段。

它可能是由混淆器引起的但不确定。解决方案是将旧方法 getResources().getIdentifier 放入代码的异常部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多