【问题标题】:Retaining Int after view gets destroyed在视图被破坏后保留 Int
【发布时间】:2020-07-20 07:10:48
【问题描述】:

我在片段中使用网格布局,用户可以在该片段上切换每行显示的项目数量(通过按下按钮,他当前可以在 6 和 4 之间切换,但可能会在添加第三个选项时扩展)。

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

在尝试了不同的选项之后(savedInstanceState:不起作用,因为永远不会重新创建活动,getArguments:不是一个可行的选项 afaik,因为我必须多次传递信息)我正在使用一个 sharedViewModel 无论如何实现为观察到一些信息。

我觉得这有点矫枉过正,因为它“只是”一个 int(如果只有 2 个状态,甚至是一个 bool),并且可能有一个更简单(“内置”?)的解决方案可能是相似的到活动的 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
    }
}
  • 所以问题是,是否有更简单/有效的方法来保留 Int? (奖励问题:SharedViewModel 实际上的效率(就内存等资源使用而言)如何?

  • 是否也有像 savedInstanceState 这样的内置方法用于片段的活动?

【问题讨论】:

  • 这看起来不错。你有什么问题?
  • 啊,对不起。我想知道,这是否是一种矫枉过正,特别是如果有一个更简单或更有效的方法的内置方法。我会编辑帖子
  • 我会这样做。不知道有什么更好的方法。有一些更简单快捷的方法,例如将值存储在单例成员变量中。

标签: android kotlin fragment android-gridlayout


【解决方案1】:

我建议将数据保留在活动中。并在片段中从onViewCreated 方法中的活动中获取数据,例如-

val data = (activity as MyActivity)?.data

另外,当数据发生变化时,以另一种方式将数据放回活动中-

(activity as MyActivity)?.data = changedData

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

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2016-11-03
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多