旋转后保持 Fragment 状态

问题描述

我有一个带有 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()
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)