【问题标题】:how pass data between fragments using LiveData如何使用 LiveData 在片段之间传递数据
【发布时间】:2020-12-08 16:26:23
【问题描述】:

我想知道如何使用 LiveData 将数据从一个片段传递到另一个片段

我有这段代码并做了一些我知道但它不起作用的事情请帮助...

这是我的第一个片段

enter code here

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

}

}

这是第二个片段

enter code here

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

    })
}

}

这是我的 ViewModel 类

enter code here

类 ViewModelPassItem:ViewModel() {

val pass = MutableLiveData<String>()

fun passdata (title : String) {

   pass.postValue(title)

} }

好的

当我点击 btn 来获取我传递的字符串时,什么也没发生...

【问题讨论】:

    标签: android kotlin android-fragments


    【解决方案1】:

    在购物车片段而不是 passign 活动生命周期所有者中传递您的片段生命周期所有者。所以而不是:

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

    这样做:

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

    【讨论】:

    • 感谢 p.mathew13 工作......但我只是传递了一个字符串。我想知道如何传递模型的 ArrayList ...我有一个模型,其中有一个 Title 和 A Price A 还有一个图像...我欣赏它
    • 很高兴它有帮助。如果它解决了您的问题,请点赞并接受答案。
    • 解决您的第二个要求:类似于 ViewModel 上的 passdata 方法,它以字符串为参数创建一个以数组列表为参数的方法,并在您想要传递数据时使用您的 ArrayList 调用此方法.您的 pass 变量也将是 arraylist 的 mutablelivedata,例如 val pass = MutableLiveData>()
    • 感谢你的身体......我很高兴为你的答案投票,但现在当我点击投票时说巡回赛的声誉很低......让我稍后再做
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多