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

jgovgodb  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(145)

我注意到,在getIdentifier的android开发者页面上,它写道:
注意:不建议使用此函数。按标识符检索资源比按名称检索资源效率高得多。
我想尽量避免使用它,但我目前的实现取决于它。
在我的数据库中,我有数百个预先填充的条目,每个条目都有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)
    )

这是一个糟糕的做法吗?有没有一个更有效的实现,让我连接我的数据库条目与他们的资源?

ruyhziif

ruyhziif1#

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

krugob8w

krugob8w2#

您可以通过两种方式从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("project_json")

注意:assets.open(“文件名带扩展名),例如assets.open("product_json.json")

使用上面的第1点比使用val inputStream: InputStream = resources.openRawResource( resources.getIdentifier(getString(R.string.product_json), "raw", packageName)访问资源快,因为getIdentifier()必须遍历所有字符串资源。这非常慢,不推荐使用,因此,IDE静态分析器显示警告“不鼓励使用此函数,因为资源反射会使代码的生成优化和编译时验证变得更加困难。通过标识符(例如www.example.com)检索资源R.foo.bar比通过名称(例如getIdentifier(“bar”,“foo”,null))"更有效。使用val inputStream: InputStream = resources.openRawResource(R.raw.product_json)更好,因为系统只需迭代原始资源。

相关问题