Android 视图被破坏后保留Int
我在一个片段中使用了一个gridlayout,用户可以在上面切换每行显示的项目数量(通过按下按钮,他可以在当前的6到4之间切换,但可能会在添加第三个选项时进行扩展) 当用户离开片段(切换到另一个片段)并稍后返回时,我希望保留每行显示多少项的信息 在尝试了不同的选项(savedInstanceState:不工作,因为活动从未重新创建,getArguments:不是可行的选项,因为我必须多次传递信息)之后,我正在使用sharedViewModel,该模型在观察到某些信息时无论如何都会实现 我觉得这太过分了,因为它“只是”一个int(如果只有两个状态,甚至是bool),可能有一个更简单的(“内置”)解决方案,可能类似于activity的savedInstanceState 下面是一些代码: 带有网格布局的片段Android 视图被破坏后保留Int,android,kotlin,fragment,android-gridlayout,Android,Kotlin,Fragment,Android Gridlayout,我在一个片段中使用了一个gridlayout,用户可以在上面切换每行显示的项目数量(通过按下按钮,他可以在当前的6到4之间切换,但可能会在添加第三个选项时进行扩展) 当用户离开片段(切换到另一个片段)并稍后返回时,我希望保留每行显示多少项的信息 在尝试了不同的选项(savedInstanceState:不工作,因为活动从未重新创建,getArguments:不是可行的选项,因为我必须多次传递信息)之后,我正在使用sharedViewModel,该模型在观察到某些信息时无论如何都会实现 我觉得这太
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
}
}
class-SharedViewModel:ViewModel(){
val booksPerLine=MutableLiveData()
内部趣味书刊(_booksPerLine:Int){
booksPerLine.value=\u booksPerLine
}
}
- 所以问题是,是否有更简单/有效的方法来保留Int?(另外一个问题:SharedViewModel的效率(就资源使用(如内存)而言)到底有多高
- 对于片段的活动是否也有类似savedInstanceState的内置方法
val data=(活动作为MyActivity)?.data
此外,当数据更改时,以另一种方式将数据放回活动中-
(活动作为MyActivity)?.data=changedData
这是手动方式。请记住数据是可以为空的。这看起来不错。你有什么问题?啊,对不起。我想知道,这是否是一种过激的方式,特别是是否有一种内置的方法更简单或更有效。我会编辑帖子。这是我应该做的。不知道有更好的方式。有更简单、快捷和简单的方法y方法类似于将值存储在单个成员变量中。