0

so I want to pass data from one to another. I'm using ViewPager to make fragments change when I click some trigger which is a button. What I want is when I click the buttonLanjut from MainActivity, I can set data from MerchantTambahBarangFragment and get that data to MerchantTambahKategoriFragment. I'm confused because the trigger is on MainActivity not in the fragment. Code below

ParentActivity which is same as MainActivity

class MerchantTambahParentActivty : AppCompatActivity(){
    lateinit var binding: ActivityMerchantTambahParentActivtyBinding
    var currentFragPosition = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMerchantTambahParentActivtyBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //Toolbar
        setToolbar()

        //Tabpager
        val pagerAdapter = PagerAdapterTambahBaran(this, supportFragmentManager)
        binding.viewPager.adapter = pagerAdapter
        nextOrBackPageAction()
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
            android.R.id.home -> {
                startActivity(Intent(this, MerchantKelolaBarangActivity::class.java))
                return true
            }
        }
        return super.onOptionsItemSelected(item)
    }

    private fun setToolbar() {
        supportActionBar?.apply {
            title = "Tambah Barang"
            setDisplayHomeAsUpEnabled(true)
        }
    }

    @SuppressLint("SetTextI18n")
    private fun nextOrBackPageAction(){
       when (currentFragPosition) {
            0 -> {
                binding.buttonKembali.visibility = View.GONE
            }
        }
        binding.buttonLanjut.setOnClickListener {

            binding.buttonKembali.visibility = View.VISIBLE
            if(currentFragPosition <= 3){
                currentFragPosition++
                Toast.makeText(this, currentFragPosition.toString(), Toast.LENGTH_SHORT).show()
                if(currentFragPosition == 4){
                    binding.buttonLanjut.text = "SUBMIT"
                    binding.buttonLanjut.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)
                }
                binding.viewPager.setCurrentItem(currentFragPosition, true)

            }
        }
        binding.buttonKembali.setOnClickListener {
            if(currentFragPosition > 0){
                currentFragPosition--
                if(currentFragPosition == 0){
                    binding.buttonKembali.visibility = View.GONE
                }
                binding.buttonLanjut.text = "Lanjut"
                binding.buttonLanjut.setCompoundDrawablesWithIntrinsicBounds(0, 0, id.co.leholeh.R.drawable.ic_arrow_next, 0)
                binding.viewPager.setCurrentItem(currentFragPosition, true)
            }
        }
    }

}

MerchantTambahBarangFragment.kt

class MerchantTambahBarangFragment : Fragment() {

lateinit var binding : FragmentMerchantTambahBarangBinding
private lateinit var cacheUtil: CacheUtil
private lateinit var auth: Login
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    binding = FragmentMerchantTambahBarangBinding.inflate(inflater,container,false)
    cacheUtil = CacheUtil()
    cacheUtil.start(requireActivity(), ConstantAuth.PREFERENCES)
    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    if (TextUtils.isEmpty(this.cacheUtil.get(ConstantAuth.AUTH))) {
        startActivity(Intent(requireActivity(), LoginActivity::class.java))
    } else {
        auth = getAuth(cacheUtil)
        //setDataCategories()
        binding.inputCover.setOnClickListener {
            ImagePicker.create(this)
                .single()
                .start()
        }

    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (ImagePicker.shouldHandle(requestCode, resultCode, data)) {
        val image: Image = ImagePicker.getFirstImageOrNull(data)
        Glide.with(binding.imageViewCover).load(image.uri).into(binding.imageViewCover)
        binding.imageViewCover.visibility = View.VISIBLE
    }
    super.onActivityResult(requestCode, resultCode, data)
}
}

MerchantTambahKategoriFragment.kt

class MerchantTambahKategoriFragment : Fragment() {

lateinit var binding : FragmentTambahKategoriBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    binding = FragmentTambahKategoriBinding.inflate(inflater, container, false)
    return binding.root
}


}

PagerAdapterTambahBarang.kt

class PagerAdapterTambahBaran(
    private val context: Context,
    fragmentManager: FragmentManager ) : 
FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

override fun getCount() = 5

override fun getItem(position: Int): Fragment = when (position) {
    0 -> MerchantTambahBarangFragment()
    1 -> MerchantTambahKategoriFragment()
    2 -> MerchantTambahLokasiFragment()
    3 -> MerchantTambahFotoFragment()
    4 -> MerhchantSubmitBarangFragment()
    else-> Fragment()
}
}

1 Answers1

0

You can solve this by using a SharedViewModel between the activity and the fragments, where in the activity when you click on the button you can update some LiveData where the children fragments observe.
you can check this answer for more info about this approach

David Ibrahim
  • 2,777
  • 4
  • 17
  • 41