视图模型数据在旋转时丢失
Viewmodel data lost on rotation
我一直在为一个项目使用 androids viewmodel。在我的项目中,我有两个片段共享一个视图模型。在片段 1 (ManageListsFragment) 中显示了视图模型的内容,用户可以导航到片段 2 (AddListFragment),可以在其中更改内容。这些片段包含在相同的简单 activity.
中
在片段 2 中进行更改,然后返回片段 1 时,更改显示没有问题。但是,当我在片段 1 中旋转屏幕时,在片段 2 中所做的更改将丢失。到底是怎么回事?视图模型不会持久化并保留更改吗?
下面是理解我的问题所需的基本代码。
片段 1:
class ManageListsFragment : Fragment() {
private lateinit var viewBinding: FragmentManageListsBinding
private val lists: ListsViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewBinding =
DataBindingUtil.inflate(inflater, R.layout.fragment_manage_lists, container, false)
// Blah blah blah
viewBinding.addListButton.setOnClickListener {
findNavController().navigate(R.id.action_manageListsFragment_to_addListFragment)
}
return viewBinding.root
}
}
片段 2:
class AddListFragment : Fragment() {
private lateinit var lists: ListsViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lists = ViewModelProvider(requireActivity()).get(ListsViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewBinding =
DataBindingUtil.inflate(inflater, R.layout.fragment_add_list, container, false)
// Blah blah blah
return viewBinding.root
}
/***
* Helper function for adding the list to the list of lists
*/
private fun addList() {
// Do changes to lists
requireActivity().onBackPressed()
}
}
提前致谢!
解决方案是让底层 activity 将视图模型数据保存在它的 onPause 函数中。
我读到如果您执行新的 Intent 然后启动相同的 Activity,则不会保存 ViewModel。文档是这样说的:https://developer.android.com/topic/libraries/architecture/saving-states
我一直在为一个项目使用 androids viewmodel。在我的项目中,我有两个片段共享一个视图模型。在片段 1 (ManageListsFragment) 中显示了视图模型的内容,用户可以导航到片段 2 (AddListFragment),可以在其中更改内容。这些片段包含在相同的简单 activity.
中在片段 2 中进行更改,然后返回片段 1 时,更改显示没有问题。但是,当我在片段 1 中旋转屏幕时,在片段 2 中所做的更改将丢失。到底是怎么回事?视图模型不会持久化并保留更改吗?
下面是理解我的问题所需的基本代码。
片段 1:
class ManageListsFragment : Fragment() {
private lateinit var viewBinding: FragmentManageListsBinding
private val lists: ListsViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewBinding =
DataBindingUtil.inflate(inflater, R.layout.fragment_manage_lists, container, false)
// Blah blah blah
viewBinding.addListButton.setOnClickListener {
findNavController().navigate(R.id.action_manageListsFragment_to_addListFragment)
}
return viewBinding.root
}
}
片段 2:
class AddListFragment : Fragment() {
private lateinit var lists: ListsViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lists = ViewModelProvider(requireActivity()).get(ListsViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewBinding =
DataBindingUtil.inflate(inflater, R.layout.fragment_add_list, container, false)
// Blah blah blah
return viewBinding.root
}
/***
* Helper function for adding the list to the list of lists
*/
private fun addList() {
// Do changes to lists
requireActivity().onBackPressed()
}
}
提前致谢!
解决方案是让底层 activity 将视图模型数据保存在它的 onPause 函数中。
我读到如果您执行新的 Intent 然后启动相同的 Activity,则不会保存 ViewModel。文档是这样说的:https://developer.android.com/topic/libraries/architecture/saving-states