Home > Software engineering >  Kotlin : How to pass image from Activity to Fragment
Kotlin : How to pass image from Activity to Fragment

Time:05-10

Im trying to pass an image from my Activity ViewModel to Fragment, the Fragment Receive the data but it doesnt showed up on the fragment. Here is my code

Main Activity ViewModel

    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()
        }

And here is my fragment Code to retrieve the image

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

CodePudding user response:

You shouldn't really be passing bitmaps around in Bundles, they're not meant for large amounts of data. It would be better to pass that string reference you're using to fetch it ("Users/$nisSiswa.png") and let the Fragment handle fetching and displaying it.

Or use a ViewModel that the activity can pass a reference to, so the data fetch happens, and the fragment observes it and displays the current data.

You should also probably be using a library like Glide to display your images, which is the official recommendation - just makes things easier for you!

  • Related