首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免使用getIdentifier检索文本资源?

如何避免使用getIdentifier检索文本资源?
EN

Stack Overflow用户
提问于 2020-11-08 07:15:03
回答 2查看 237关注 0票数 1

我注意到,在用于getIdentifier的android开发者页面上,它声明:

注:不鼓励使用此功能。按标识符检索资源比按名称检索资源要有效得多。

我想尽量避免使用它,但是我目前的实现依赖于它。

在我的数据库中,我有数百个预先填充的条目,每个条目有3个相关的字符串资源和一个图像。为了通过条目访问资源,我将资源名称保存为元组中的字符串,然后使用getIdentifier加载它们。

如果我的实现令人困惑,这里有一些图片和示例代码:

字符串资源文件

数据库表

示例代码:

代码语言:javascript
运行
复制
coin = model.getSelectedCoin()!!

    binding.topMedia.setImageResource(
        resources.getIdentifier(coin.imageAddress, "drawable", requireContext().packageName)
    )

    binding.descriptionText.text = resources.getString(
        resources.getIdentifier(coin.description,"string", requireContext().packageName)
    )

这做法不好吗?是否有更有效的实现使我能够将数据库条目与它们的资源连接起来?

EN

回答 2

Stack Overflow用户

发布于 2022-11-06 20:30:44

您可以通过两种方式从资产文件夹或res/raw文件夹获取文本资源( product_json.json),假设您的文件名为)

  • 您可以将一个文件名为product_json的文件放在res/raw文件夹中,并按如下方式进行访问。 val inputStream: InputStream = resources.openRawResource(R.raw.product_json)
  • 或者,您可以将您的文件放在assets文件夹中(如果不存在,欢迎您创建一个!)如下所示。 val inputStream: InputStream = assets.open(getString("product_json")

Note:assets.open(“file_name_with_extension”),例如,assets.open("product_json.json")

使用上面的第1点比使用val inputStream: InputStream = resources.openRawResource( resources.getIdentifier(getString(R.string.product_json), "raw", packageName)访问资源要快,因为getIdentifier()必须对所有字符串资源进行迭代。这是非常缓慢的,不建议使用,因此IDE静态分析器显示警告“使用此函数是不可取的,因为资源反射使得执行构建优化和代码编译时验证变得更加困难。按标识符(例如R.foo.bar)检索资源比按名称检索资源(例如getIdentifier("bar”、"foo“、空))要高得多。使用val inputStream: InputStream = resources.openRawResource(R.raw.product_json)更好,因为系统只需对原始资源进行迭代。

票数 1
EN

Stack Overflow用户

发布于 2020-11-08 09:07:26

也许您可以在数据库之外设置这些值?创建一个描述您的级别的对象,并使用它们的resourceIds定义该对象的图像和描述。这些基本上是与UI相关的值,它们根本不应该在数据库中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64735689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档