Kotlin:如何将图像从 Activity 传递到 Fragment
Kotlin : How to pass image from Activity to Fragment
我试图将图像从我的 Activity ViewModel 传递到 Fragment,Fragment 收到数据但它没有显示在 Fragment 上。这是我的代码
主要Activity视图模型
val storageRef = FirebaseStorage.getInstance().reference.child("Users/$nisSiswa.png")
val file = File.createTempFile("image", "png")
storageRef.getFile(file).addOnSuccessListener {
val bitmap : Bitmap = BitmapFactory.decodeFile(file.absolutePath)
val bitmapString = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapString)
val byteArray : ByteArray = bitmapString.toByteArray()
profileBundle.putByteArray("foto", byteArray)
profilFragment.arguments = profileBundle
crashlytics.log("Bundle Dikirimkan ke Fragment")
loadingDialog.dismissLoading()
}
这是我检索图像的片段代码
super.onViewCreated(view, savedInstanceState)
binding.tvNamaSiswa.setText(arguments?.getString("nama"))
binding.tvNisSiswa.setText(arguments?.getString("nis"))
binding.tvEmailSiswa.setText(arguments?.getString("email"))
val byteFoto = arguments?.getByteArray("foto")
if (byteFoto != null) {
crashlytics.log("Data Berhasil Diterima Profile Fragment")
val bitmapFoto : Bitmap = BitmapFactory.decodeByteArray(byteFoto,0, DEFAULT_BUFFER_SIZE)
val encoded : ByteArray? = Base64.decode(byteFoto, Base64.DEFAULT)
val bitmap = encoded?.let { BitmapFactory.decodeByteArray(encoded, 0, it.size) }
binding.ivProfil.setImageBitmap(bitmapFoto)
} else {
Toast.makeText(this.context, "File Bitmap Kosong", Toast.LENGTH_SHORT).show()
binding.ivProfil.setImageResource(R.drawable.user_foto)
}
您真的不应该在 Bundle
秒内传递位图,它们不适用于大量数据。最好传递您用来获取它的字符串引用 ("Users/$nisSiswa.png"
) 并让 Fragment
处理获取和显示它。
或者使用 activity 可以传递引用的 ViewModel
,这样就会发生数据获取,并且片段 observe
获取它并显示当前数据。
您可能还应该使用像 Glide to display your images, which is the official recommendation 这样的库 - 只会让事情变得更容易!
我试图将图像从我的 Activity ViewModel 传递到 Fragment,Fragment 收到数据但它没有显示在 Fragment 上。这是我的代码
主要Activity视图模型
val storageRef = FirebaseStorage.getInstance().reference.child("Users/$nisSiswa.png")
val file = File.createTempFile("image", "png")
storageRef.getFile(file).addOnSuccessListener {
val bitmap : Bitmap = BitmapFactory.decodeFile(file.absolutePath)
val bitmapString = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapString)
val byteArray : ByteArray = bitmapString.toByteArray()
profileBundle.putByteArray("foto", byteArray)
profilFragment.arguments = profileBundle
crashlytics.log("Bundle Dikirimkan ke Fragment")
loadingDialog.dismissLoading()
}
这是我检索图像的片段代码
super.onViewCreated(view, savedInstanceState)
binding.tvNamaSiswa.setText(arguments?.getString("nama"))
binding.tvNisSiswa.setText(arguments?.getString("nis"))
binding.tvEmailSiswa.setText(arguments?.getString("email"))
val byteFoto = arguments?.getByteArray("foto")
if (byteFoto != null) {
crashlytics.log("Data Berhasil Diterima Profile Fragment")
val bitmapFoto : Bitmap = BitmapFactory.decodeByteArray(byteFoto,0, DEFAULT_BUFFER_SIZE)
val encoded : ByteArray? = Base64.decode(byteFoto, Base64.DEFAULT)
val bitmap = encoded?.let { BitmapFactory.decodeByteArray(encoded, 0, it.size) }
binding.ivProfil.setImageBitmap(bitmapFoto)
} else {
Toast.makeText(this.context, "File Bitmap Kosong", Toast.LENGTH_SHORT).show()
binding.ivProfil.setImageResource(R.drawable.user_foto)
}
您真的不应该在 Bundle
秒内传递位图,它们不适用于大量数据。最好传递您用来获取它的字符串引用 ("Users/$nisSiswa.png"
) 并让 Fragment
处理获取和显示它。
或者使用 activity 可以传递引用的 ViewModel
,这样就会发生数据获取,并且片段 observe
获取它并显示当前数据。
您可能还应该使用像 Glide to display your images, which is the official recommendation 这样的库 - 只会让事情变得更容易!