【问题标题】:Android viewpager2 tab layout with FragmentStateAdapter带有 FragmentStateAdapter 的 Android viewpager2 选项卡布局
【发布时间】:2021-01-04 13:25:32
【问题描述】:

我正在使用 ViewPager2 和选项卡布局。这是我的MainFragment 代码-

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    binding.viewPager.adapter = MyPagerAdapter(requireActivity())
    TabLayoutMediator(
        binding.tabLayout,  binding.viewPager
    ) { tab, position ->
        binding.viewPager.setCurrentItem(0, true)
        when (position) {
            0 -> tab.text = “Tab A”
            1 -> tab.text = “Tab B”      
        }
    }.attach()
}


private class MyPagerAdapter(fragmentActivity: FragmentActivity) :
    FragmentStateAdapter(fragmentActivity) {
    private val items = 2
    override fun getItemCount(): Int {
        return items
    }

    override fun createFragment(position: Int): Fragment = when (position) {
        0 -> FragmentA()
        1 -> FragmentB()
        else -> FragmentA()
    }
}

我有 2 个问题在这里 -

  1. override fun createFragment(position: Int): Fragment 每次创建 MainFragment 视图时都会创建子片段的新实例。有没有办法重用已经存在的子片段实例?

  2. 在我的导航图中,我有MainFragment 及其子FragmentAFragmentB。为什么我不能使用导航操作从其父级打开子级?如果是,override fun createFragment(position: Int): Fragment 需要返回 Fragment 而findNavController().navigate() 不返回任何内容。我该怎么做?

【问题讨论】:

  • 因此您想使用导航打开子片段,例如 FRAGMENT A 和 FRAGMENT B,作为 MAIN FRAGMENT 留在父片段中。

标签: android kotlin android-fragments android-architecture-navigation android-viewpager2


【解决方案1】:

您可以按照此示例代码进行操作,希望对您有所帮助

类 TvShowsFragment : Fragment(R.layout.tvshows_fragment) {

private var _binding: TvshowsFragmentBinding? = null
private val binding get() = _binding!!

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    _binding = TvshowsFragmentBinding.bind(view)

    setUpViewPager()
    setHasOptionsMenu(true)
}

private fun setUpViewPager() {
    val viewPager = binding.vpTvShows
    val tab = binding.tlTvShows
    val adapterTv = TvAdapter(this)
    viewPager.adapter = adapterTv

    TabLayoutMediator(tab, viewPager) { tabText, position ->
        tabText.text = when (position) {
            0 -> getString(R.string.title_tvAiringToday)
            1 -> getString(R.string.title_tvOnTheAir)
            2 -> getString(R.string.title_popular)
            3 -> getString(R.string.title_topRated)
            else -> getString(R.string.title_tvAiringToday)

        }
    }.attach()

}

private inner class TvAdapter(fm: Fragment) : FragmentStateAdapter(fm) {

    override fun getItemCount(): Int = 4

    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> TvAiringTodayFragment()
            1 -> TvOnTheAirFragment()
            2 -> TvPopularFragment()
            3 -> TvTopRatedFragment()
            else -> TvAiringTodayFragment()
        }
    }

}

【讨论】:

  • 这不能回答我的问题。我也有同样的实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多