我注意到,在用于getIdentifier的android开发者页面上,它声明:
注:不鼓励使用此功能。按标识符检索资源比按名称检索资源要有效得多。
我想尽量避免使用它,但是我目前的实现依赖于它。
在我的数据库中,我有数百个预先填充的条目,每个条目有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)
)
这做法不好吗?是否有更有效的实现使我能够将数据库条目与它们的资源连接起来?
发布于 2022-11-06 20:30:44
您可以通过两种方式从资产文件夹或res/raw文件夹获取文本资源( product_json.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)
更好,因为系统只需对原始资源进行迭代。
发布于 2020-11-08 09:07:26
也许您可以在数据库之外设置这些值?创建一个描述您的级别的对象,并使用它们的resourceIds定义该对象的图像和描述。这些基本上是与UI相关的值,它们根本不应该在数据库中。
https://stackoverflow.com/questions/64735689
复制相似问题