我注意到 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 加载它们。
如果我的实现令人困惑,这里有一些图片和示例代码:
示例代码:
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/