【发布时间】:2020-10-03 09:24:35
【问题描述】:
所以,我有一个非常奇怪的问题,我将一个对象从 Fragment A 传递到 Fragment B ,我在 Fragment B 的一个新实例中修改了这个对象,但是在我更改此对象的值后,当我弹出 Fragment B 并且该对象现在也为 Fragment A
保持修改时,它也会更改该值片段 A
...
override fun onItemClick(v: View?, position: Int) {
searchView.clearFocus()
val bundle = Bundle()
bundle.putSerializable("shop", landingAdapter.getItem(position))
findNavController().navigate(R.id.action_navigation_landing_to_shopFragment, bundle)
}
...
现在,我从 Fragment B 得到这个对象
片段 B
private lateinit var shop: Shop
private lateinit var shopAdapter:ShopAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
shopAdapter = ShopAdapter(sharedViewModel, requireContext(),this)
arguments?.let {
shop = it.getSerializable(ARG_SHOP) as Shop
if (shop.products.isNotEmpty()) {
shopAdapter.setItems(shop.products)
}
}
}
现在,在我从 Fragment A 获得这个 Shop 对象后,我只在 Fragment B 中修改它
onViewCreated(){
shop.quantity = 1
}
但是当我回到 Fragment A 时,现在 Shop 对象数量值为 1 ,但这应该没什么,因为我只更改了 Fragment B 而不是 Fragment A 的对象,而在 Fragment B 中是一个新实例对象
我真的很困惑
编辑
到目前为止,我每次从片段 A 转到片段 b 时都尝试发送一个新实例
val bundle = Bundle()
bundle.putSerializable("shop", landingAdapter.getItem(position).copy())
findNavController().navigate(R.id.action_navigation_landing_to_shopFragment, bundle)
val bundle = Bundle()
val shop = landingAdapter.getItem(position)
bundle.putSerializable("shop", shop) findNavController().navigate(R.id.action_navigation_landing_to_shopFragment, bundle)
val bundle = Bundle()
val shop = Shop(landingAdapter.getItem(position).name,landingAdapter.getItem(position).quantity)
bundle.putSerializable("shop", shop)
findNavController().navigate(R.id.action_navigation_landing_to_shopFragment, bundle)
它们都没有向 Fragment B 发送新的 shop 实例,因此每当我在 Fragment B 处更改数量时,Fragment A 都会获得相同的数量值,不应发生变化
【问题讨论】:
-
如果您不想在原始位置修改它,您需要传递一个副本,不是吗?我不记得足够多的 Android 来回忆 get/putSerializable 做了什么。
-
但是如果我将原始对象传递给片段 B,那么在片段 b 中,我正在创建该对象的一个新实例,我在其中进行更改,奇怪的是这种更改也会影响原始对象
-
如果你在其他类中改变了传递的对象,它会影响原来的对象,除非你对对象进行深拷贝,所以它将是另一个不同的对象
-
是什么让你认为你得到了一个新的、不相关的实例?
-
但是如果我像现在一样将 Fragment A 中的对象作为一个包传递,并且我创建了一个 Shop 类型的新变量来保存它,为什么我在那里所做的更改会影响原始对象
标签: android android-fragments kotlin android-architecture-components android-architecture-navigation