【问题标题】:Jetpack Compose how do i work with images when variable changes?Jetpack Compose 在变量更改时如何处理图像?
【发布时间】:2022-01-04 12:49:58
【问题描述】:

我使用可组合函数图像。我需要根据它获得的变量来使用特定的图像。 硬编码时它看起来像下面的代码,这适用于特定图像。

Image(
       painterResource(id = R.drawable.carrot),
       contentDescription = "carrot",
       )

问题是我希望它像下图一样工作,其中 recipe.image 会根据它从数据库中获取的内容而变化。

Image(
       painterResource(id = recipe.image),
       contentDescription = "recipe.name",    
            )

不知何故,它需要本地保存的可绘制对象的确切路径。

我尝试过的: 我尝试将 R.drawable.carrot 作为整数直接上传到数据库,它将其保存为 2400440340 之类的东西,当这个整数进入painterResource 时它会崩溃。 我尝试将“R.drawable.carrot”直接作为字符串保存到数据库中,但这也不起作用,因为画家需要一个整数。

我能在这个网站上找到这个问题的唯一建议是 11 年前的这个答案:

int drawableId = getResources().getIdentifier(drawablename, "drawable", getPackageName());
imageview.setImageResource(drawableId);

我似乎找不到函数 getResources 或 getIdentifier。

【问题讨论】:

  • getResourcesContext 上调用,在 Compose 中您可以使用 LocalContext.current 获取它。此外,这看起来像是您之前问题的演变 - 下次请不要删除它,只需编辑它。
  • 谢谢!不习惯用栈,一头雾水,不小心删帖了
  • 没问题!在这种情况下您可以取消删除它,但现在不再需要了,因为您有这个。

标签: android kotlin android-jetpack-compose


【解决方案1】:

我尝试过的:我尝试将 R.drawable.carrot 作为整数直接上传到数据库,它会将其保存为 2400440340 之类的东西,当这个整数进入painterResource 时它会崩溃。

它崩溃是因为资源中的这个 Int 值只是一个运行时引用,这意味着如果您重新启动应用程序,资源,例如 R.drawable.carrot,将获得新的引用。 如果您想在 painterResource 中添加另一个图像,则必须在某处更改 recipe.name 的值,或者将图像二进制文件保存在数据库中(这不是很高效,我建议不要这样做)。

您可以将它们加载到资产上: 如果您没有资产文件夹,请在此位置创建一个: app/src/main/assets/

然后你可以使用如下函数访问它:

    fun getImageFromAssets(imageName: String): Bitmap {
        val imageStream = assets.open(imageName)
        val bitmap = BitmapFactory.decodeStream(imageStream)
        imageStream.close()
        return bitmap
    }

Android Studio 会建议您“内联”变量,但不要这样做。如果在返回点内联BitmapFactory,则在解码之前关闭Stream

您现在可以简单地从数据库中调用名称,例如:

val image: Bitmap = getImageFromAssets("imageName.jpg")

【讨论】:

  • 感谢您的回复!你知道什么是最佳实践吗?我一直在考虑用所有图像制作一个列表,然后将特定的列表编号保存到数据库中。因此,例如列表(胡萝卜,土豆,番茄)然后我将 0 -> 胡萝卜保存到数据库中。最后我会打电话给painterResource(id = list(recipe.image)。我认为这可行,但它看起来不太漂亮或可扩展。
  • 你可以尝试把你的图片放在 assets 文件夹中,并用它们的文件名加载它们。在这种情况下,您可以将图像名称保存为字符串。我将更新我上面的帖子以说明我的意思。
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 2021-10-15
  • 2021-10-27
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多