有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

FragmentStateAdapter()上的java createFragment()方法在创建适配器的新实例后不会再次运行

我使用ViewPager2和导航组件。在我的应用程序设置中,我有一个选项来控制ViewPager2中片段的数量(“下面的appMode”选项),以及哪个片段必须是第一个(“下面的primaryScreen”选项)。在我的适配器中,我选中该选项并创建必要的片段:

override fun getItemCount() = if (appMode == "both") 2 else 1

override fun createFragment(position: Int): Fragment {
    return when (primaryScreen) {
        "notes" -> if (position == 0) NotesFragment() else TasksFragment()
        else -> if (position == 0) TasksFragment() else NotesFragment()
    }
}

但当我回到我的ViewPager时,一切都不会改变,直到我重新启动我的应用程序。如果我在onDestroyView()中取消ViewPager适配器,我不知道它为什么不工作:

b.viewPager.adapter = null
adapter = null

以下是我如何将适配器应用于我的ViewPager2:

private var adapter: VPAdapter? = null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    adapter = VPAdapter(this)
    b.viewPager.adapter = adapter
}

我的ViewPager2适配器的完整代码:

class VPAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {

    private val prefs by lazy {
        fragment.requireContext().getSharedPreferences("MainSettings", Context.MODE_PRIVATE) }

    private var appMode
        get() = prefs.getString("appMode", "both")
        set(value) = prefs.edit { putString("appMode", value) }

    private var primaryScreen
        get() = prefs.getString("primaryScreen", "notes")
        set(value) = prefs.edit { putString("primaryScreen", value) }

    override fun getItemCount() = if (appMode == "both") 2 else 1

    override fun createFragment(position: Int): Fragment {
        println("createFragment") // I use it to detect when it runs
        return when (primaryScreen) {
            "notes" -> if (position == 0) NotesFragment() else TasksFragment()
            else -> if (position == 0) TasksFragment() else NotesFragment()
        }
    }

}

共 (0) 个答案