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