bahador jadidoleslam
bahador jadidoleslam

Reputation: 69

how pass data between fragments using LiveData

i want to know how pass data from one fragment to other using LiveData

i have this code and do somethings that i know but it doesnt work pls help ...

this is my first fragmetn

enter code here

class ItemDetailsfragment : Fragment() { lateinit var viewmodel: ViewModelPassItem

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.details_items_page, container, false)

    val title = arguments?.getString("title")
    view.title_details_item.text = title

    val price = arguments?.getString("price")
    view.price_item_details.text = price

    val image = arguments?.getString("image")
    Picasso.get().load(image).into(view.image_items_detail)

    return view
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    viewmodel = ViewModelProviders.of(activity!!).get(ViewModelPassItem::class.java)


    val title: TextView = view.findViewById(R.id.title_details_item)

    
    view.plus_icon_item_details.setOnClickListener {


    viewmodel.passdata(title.text.toString())

         val myfragment = Cart_Fragment()
    }

}

}

and this is second fragment

enter code here

class Cart_Fragment : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val viewitem = inflater.inflate(R.layout.cart_fragment, container, false)


    val choosebtn: Button = viewitem.findViewById(R.id.choose_titme_and_submit_order_btn)
    choosebtn.visibility = View.GONE


    val rl_cart = viewitem.findViewById<RecyclerView>(R.id.recycler_view_cart)
    rl_cart.visibility = View.GONE


    val navbar: BottomNavigationView = activity!!.findViewById(R.id.nav_view_bottom_main)
    navbar.visibility = View.GONE

    val homeicon: ImageButton = viewitem.home_icon_cart
    homeicon.setOnClickListener {

        activity?.let {

            val intent = Intent(requireContext(), HomeActivity::class.java)
            it.startActivity(intent)

        }
    }


    viewitem.start_shopping_in_cart.setOnClickListener {

        activity?.let {

            val intent = Intent(requireContext(), HomeActivity::class.java)
            it.startActivity(intent)


        }


    }

    return viewitem
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)


    val viewmodel = ViewModelProviders.of(activity!!).get(ViewModelPassItem::class.java)


    viewmodel.pass.observe(activity!!, Observer {


        d("main", "${it.toString()}")

    })
}

}

and this is my ViewModel Class

enter code here

class ViewModelPassItem:ViewModel() {

val pass = MutableLiveData<String>()

fun passdata (title : String) {

   pass.postValue(title)

} }

ok

when i click on btn to get string that i pass nothing happend ...

Upvotes: 0

Views: 1301

Answers (1)

p.mathew13
p.mathew13

Reputation: 921

In the Cart Fragment instead of passign activity lifecycleowner pass your fragments lifecycle owner. So instead of :

viewmodel.pass.observe(activity!!, Observer {

    Log.d("main", "${it.toString()}")

})

Do this :

viewmodel.pass.observe(this.viewLifecycleOwner, Observer {
    Log.d("main", "${it.toString()}")

})

Upvotes: 2

Related Questions