You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:48:30