![](/img/trans.png)
[英]How do layouts work in Jetpack Compose and how do they relate to XML?
[英]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.