繁体   English   中英

Jetpack Compose 在变量更改时如何处理图像?

[英]Jetpack Compose how do i work with images when variable changes?

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

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

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

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

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

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

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

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

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

我已经尝试过:我尝试将 R.drawable.carrot 作为 Integer 直接上传到数据库,它将它保存为类似 2400440340 的东西,当这个 Z157DB7DF5366CResource6 崩溃时它会崩溃

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

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

然后您可以使用 function 访问它,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM