Android 视图被破坏后保留Int

Android 视图被破坏后保留Int,android,kotlin,fragment,android-gridlayout,Android,Kotlin,Fragment,Android Gridlayout,我在一个片段中使用了一个gridlayout,用户可以在上面切换每行显示的项目数量(通过按下按钮,他可以在当前的6到4之间切换,但可能会在添加第三个选项时进行扩展) 当用户离开片段(切换到另一个片段)并稍后返回时,我希望保留每行显示多少项的信息 在尝试了不同的选项(savedInstanceState:不工作,因为活动从未重新创建,getArguments:不是可行的选项,因为我必须多次传递信息)之后,我正在使用sharedViewModel,该模型在观察到某些信息时无论如何都会实现 我觉得这太

我在一个片段中使用了一个gridlayout,用户可以在上面切换每行显示的项目数量(通过按下按钮,他可以在当前的6到4之间切换,但可能会在添加第三个选项时进行扩展)

当用户离开片段(切换到另一个片段)并稍后返回时,我希望保留每行显示多少项的信息

在尝试了不同的选项(savedInstanceState:不工作,因为活动从未重新创建,getArguments:不是可行的选项,因为我必须多次传递信息)之后,我正在使用sharedViewModel,该模型在观察到某些信息时无论如何都会实现

我觉得这太过分了,因为它“只是”一个int(如果只有两个状态,甚至是bool),可能有一个更简单的(“内置”)解决方案,可能类似于activity的savedInstanceState

下面是一些代码:

带有网格布局的片段

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方法类似于将值存储在单个成员变量中。