视图被销毁后保留 Int
Retaining Int after view gets destroyed
我在片段中使用网格布局,用户可以在其中切换每行显示的项目数量(通过按下按钮,他当前可以在 6 和 4 之间切换,但可能会在添加第三个选项时扩展)。
当用户离开片段(切换到另一个片段)并稍后返回时,我想保留每行显示多少项目的信息。
在尝试了不同的选项后(savedInstanceState:不起作用,因为 activity 永远不会重新创建,getArguments:据我所知,这不是一个可行的选项,因为我必须多次传递信息)我正在使用sharedViewModel,因为观察到一些信息,无论如何都会实现。
我觉得这是一个矫枉过正,因为它是 "just" 一个 int(或者甚至是一个 bool,如果只有 2 个状态)并且可能有一个更简单的("built in"?)可能类似于 activity 的 savedInstanceState.
的解决方案
这是一些代码:
带有 GridLayout 的片段
class LibraryFragment : Fragment() {
private val model: SharedViewModel by activityViewModels()
private lateinit var gridlayoutManager: GridLayoutManager
private lateinit var thumbnailAdapter: ThumbnailAdapter
private lateinit var thumbnailRecyclerView: RecyclerView
private var booksPerLine = 4
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentLibraryViewerBinding.inflate(layoutInflater)
val view = libraryFragmentBinding.root
initRecyclerView()
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.booksPerLine.observe(viewLifecycleOwner, Observer {
booksPerLine = it
switchNoOfBooksPerLine()
})
}
private fun initRecyclerView() {
thumbnailRecyclerView = libraryFragmentBinding.thumbnailRecyclerView
switchNoOfBooksPerLine()
thumbnailAdapter = ThumbnailAdapter { selectedBook: Book -> displaySelectedBook(selectedBook) }
thumbnailAdapter.setThumbnailList(listOf())
thumbnailRecyclerView.adapter = thumbnailAdapter
}
private fun switchNoOfBooksPerLine() {
gridlayoutManager = GridLayoutManager(requireContext(), booksPerLine, LinearLayoutManager.VERTICAL, false)
thumbnailRecyclerView.layoutManager = gridlayoutManager
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.change_grid -> {
when (booksPerLine) {
4 -> model.setBooksPerLine(6)
6 -> model.setBooksPerLine(4)
}
true
}
}
}
}
带网格信息的SharedViewModel
class SharedViewModel : ViewModel() {
val booksPerLine = MutableLiveData<Int>()
internal fun setBooksPerLine(_booksPerLine: Int) {
booksPerLine.value = _booksPerLine
}
}
那么问题来了,有没有更simple/efficient的方式来保留Int呢? (奖励问题:SharedViewModel 实际上有多高效(就内存等资源使用而言)?
对于片段的活动,是否也有类似 savedInstanceState 的内置方法?
我建议将数据保存在 activity 中。并在片段中从 activity 中的 onViewCreated
方法中获取数据,如-
val data = (activity as MyActivity)?.data
另外,当数据改变时,将数据以另一种方式放回activity-
(activity as MyActivity)?.data = changedData
这是手动方式。请记住,数据可以为空。
我在片段中使用网格布局,用户可以在其中切换每行显示的项目数量(通过按下按钮,他当前可以在 6 和 4 之间切换,但可能会在添加第三个选项时扩展)。
当用户离开片段(切换到另一个片段)并稍后返回时,我想保留每行显示多少项目的信息。
在尝试了不同的选项后(savedInstanceState:不起作用,因为 activity 永远不会重新创建,getArguments:据我所知,这不是一个可行的选项,因为我必须多次传递信息)我正在使用sharedViewModel,因为观察到一些信息,无论如何都会实现。
我觉得这是一个矫枉过正,因为它是 "just" 一个 int(或者甚至是一个 bool,如果只有 2 个状态)并且可能有一个更简单的("built in"?)可能类似于 activity 的 savedInstanceState.
的解决方案这是一些代码:
带有 GridLayout 的片段
class LibraryFragment : Fragment() {
private val model: SharedViewModel by activityViewModels()
private lateinit var gridlayoutManager: GridLayoutManager
private lateinit var thumbnailAdapter: ThumbnailAdapter
private lateinit var thumbnailRecyclerView: RecyclerView
private var booksPerLine = 4
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentLibraryViewerBinding.inflate(layoutInflater)
val view = libraryFragmentBinding.root
initRecyclerView()
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.booksPerLine.observe(viewLifecycleOwner, Observer {
booksPerLine = it
switchNoOfBooksPerLine()
})
}
private fun initRecyclerView() {
thumbnailRecyclerView = libraryFragmentBinding.thumbnailRecyclerView
switchNoOfBooksPerLine()
thumbnailAdapter = ThumbnailAdapter { selectedBook: Book -> displaySelectedBook(selectedBook) }
thumbnailAdapter.setThumbnailList(listOf())
thumbnailRecyclerView.adapter = thumbnailAdapter
}
private fun switchNoOfBooksPerLine() {
gridlayoutManager = GridLayoutManager(requireContext(), booksPerLine, LinearLayoutManager.VERTICAL, false)
thumbnailRecyclerView.layoutManager = gridlayoutManager
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.change_grid -> {
when (booksPerLine) {
4 -> model.setBooksPerLine(6)
6 -> model.setBooksPerLine(4)
}
true
}
}
}
}
带网格信息的SharedViewModel
class SharedViewModel : ViewModel() {
val booksPerLine = MutableLiveData<Int>()
internal fun setBooksPerLine(_booksPerLine: Int) {
booksPerLine.value = _booksPerLine
}
}
那么问题来了,有没有更simple/efficient的方式来保留Int呢? (奖励问题:SharedViewModel 实际上有多高效(就内存等资源使用而言)?
对于片段的活动,是否也有类似 savedInstanceState 的内置方法?
我建议将数据保存在 activity 中。并在片段中从 activity 中的 onViewCreated
方法中获取数据,如-
val data = (activity as MyActivity)?.data
另外,当数据改变时,将数据以另一种方式放回activity-
(activity as MyActivity)?.data = changedData
这是手动方式。请记住,数据可以为空。