视图被销毁后保留 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
    }
}

我建议将数据保存在 activity 中。并在片段中从 activity 中的 onViewCreated 方法中获取数据,如-

val data = (activity as MyActivity)?.data

另外,当数据改变时,将数据以另一种方式放回activity-

(activity as MyActivity)?.data = changedData

这是手动方式。请记住,数据可以为空。