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

标签 android android-studio kotlin android-room android-resources

我注意到 android developer page for getIdentifier它指出:

Note: use of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.

我想尽量避免使用它,但我当前的实现取决于它。

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

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

string resources file

database table

示例代码:

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)
    )

这是不好的做法吗?是否有更有效的实现可以让我将数据库条目与其资源连接起来?

最佳答案

您可以通过两种方式从assets文件夹或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")

注意: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", null)) 检索资源"。使用val inputStream: InputStream = resources.openRawResource(R.raw.product_json)更好,因为系统只需迭代原始资源。

关于android - 如何避免使用 getIdentifier 检索文本资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64735689/

相关文章:

java - 仅支持从 Android N (--min-api 24) 开始的静态接口(interface)方法

抛出异常时Android CoroutineWorker重试

java - Kotlin 中的 JOOQ SUM 与自定义类型

android - 在Unity中,如何构建和播放WebGL项目并在Android设备上播放?

java - 没有缓存版本的 com.android.tools.build :aapt2:3. 2.0-alpha18-4804415 可用于离线模式

java - 错误 :Unexpected type tag 13996 found. 或为方法数超过 64K 的应用启用 Multidex

AndroidManifest 每个版本?

android - 如何在多个 ViewModel 之间共享 LiveData?

Java Android - 如何调用 onSuccess 方法

android - android属性中格式引用的含义