如何在不使用ViewPager的TabLayout中记住选中标签页位置?
解决TabLayout返回后位置重置的问题
要解决返回后标签页位置变回第一个的问题,核心是利用Fragment的状态保存机制,在页面销毁前记录当前选中的标签页位置,重建时恢复该位置。
步骤1:定义状态保存的Key
在Fragment类中定义一个常量,作为保存标签页位置的键:
private const val SELECTED_TAB_POSITION = "selected_tab_position"
步骤2:保存选中的标签页位置
重写onSaveInstanceState方法,将当前选中的位置存入Bundle:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 保存当前选中的标签页位置 outState.putInt(SELECTED_TAB_POSITION, position) }
步骤3:恢复标签页位置
在onCreateView方法中,从savedInstanceState中读取保存的位置,若存在则选中对应的标签页:
class PartnersFragment : Fragment() { private const val SELECTED_TAB_POSITION = "selected_tab_position" private var position = 0 // 默认选中第一个标签页 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // 从savedInstanceState恢复位置 savedInstanceState?.let { position = it.getInt(SELECTED_TAB_POSITION, 0) } // 初始化TabLayout监听 binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { if (tab != null) { position = tab.position when (tab.position) { 0 -> connectedPartners() 1 -> discoverPartners() 2 -> rejectedPartners() } } } override fun onTabUnselected(tab: TabLayout.Tab?) {} override fun onTabReselected(tab: TabLayout.Tab?) {} }) // 恢复选中的标签页 binding.tabLayout.getTabAt(position)?.select() return binding.root } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt(SELECTED_TAB_POSITION, position) } // 你的connectedPartners()、discoverPartners()、rejectedPartners()方法 private fun connectedPartners() { /* ... */ } private fun discoverPartners() { /* ... */ } private fun rejectedPartners() { /* ... */ } }
关键说明
onSaveInstanceState会在Fragment即将被销毁(比如返回栈弹出后重建)时调用,此时保存当前选中的标签页位置。- 在
onCreateView中,先从savedInstanceState读取保存的位置,再调用binding.tabLayout.getTabAt(position)?.select()选中对应的标签页,同时触发onTabSelected方法加载对应的RecyclerView数据。
内容的提问来源于stack exchange,提问作者FrensisXh
相关产品推荐
相关产品推荐

