旋转后保持 Fragment 状态

时间:2021-01-17 19:52:26

标签: android kotlin android-fragments onsaveinstancestate

我有一个带有 ViewPager 的片段。我正在尝试保存选择了哪个选项卡的信息,以便在旋转屏幕时可以正确检索。这是我的代码:

class MainFragment : Fragment() {

    var currentPage: Int = 0

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.e("DEBUGGING", "onViewCreated: savedInstanceState = $savedInstanceState")
        savedInstanceState?.getInt("currentPage")?.let{
            Log.e("DEBUGGING", "onViewCreated: it = $it")
            currentPage = it
        }
        setViewPagerWithTabs()
    }


    private fun setViewPagerWithTabs() {
        val arrayListOfScreens = arrayListOf<TabScreen>()
        arrayListOfScreens.add(
            TabScreen(
                TodayFragment(),
                getString(R.string.today),
                R.drawable.ic_baseline_wb_sunny_24
            )
        )
        arrayListOfScreens.add(
            TabScreen(
                ForecastFragment(),
                getString(R.string.forecast),
                R.drawable.ic_baseline_event_24
            )
        )

        view_pager.adapter = SectionsPagerAdapter(arrayListOfScreens, childFragmentManager)
        tabs.setupWithViewPager(view_pager)
        Log.e("DEBUGGING", "setViewPagerWithTabs: currentPage = $currentPage")
        view_pager.currentItem = currentPage
        view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageSelected(position: Int) {
                Log.e("DEBUGGING", "onPageSelected: position = $position")
                currentPage = position
            }

            override fun onPageScrolled(
                position: Int,
                positionOffset: Float,
                positionOffsetPixels: Int
            ) {
            }

            override fun onPageScrollStateChanged(state: Int) {}
        })

        // setup icons
        var index = 0
        arrayListOfScreens.forEach {
            tabs.getTabAt(index)?.setIcon(it.icon)
            index++
        }
    }


    override fun onSaveInstanceState(outState: Bundle) {
        outState.putInt("currentPage", currentPage)
        Log.e("DEBUGGING", "onSaveInstanceState: currentPage = $currentPage")
        super.onSaveInstanceState(outState)
    }
}

这些是旋转时的日志结果:

E/DEBUGGING: onPageSelected: position = 1
E/DEBUGGING: onSaveInstanceState: currentPage = 1
E/DEBUGGING: onViewCreated: savedInstanceState = null
E/DEBUGGING: setViewPagerWithTabs: currentPage = 0

我不知道为什么没有保存状态...我也尝试使用 onViewStateRestored() 但结果完全一样。

MainFragment 在 MainActivity 中是这样调用的:

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (!mainViewModel.hasCurrentData() && !mainViewModel.internetAvailable()) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, NoDataFragment())
                .commitNow()
        } else {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, MainFragment())
                .commitNow()
        }
    }

0 个答案:

没有答案