簡體   English   中英

Android viewpager2 選項卡布局與 FragmentStateAdapter

[英]Android viewpager2 tab layout with FragmentStateAdapter

我正在使用帶有選項卡布局的 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()
    }
}

我這里有兩個問題-

  1. override fun createFragment(position: Int): Fragment每次創建MainFragment視圖時,Fragment 都會創建子 Fragment 的新實例。 有沒有辦法重用已經存在的子片段實例?

  2. 在我的導航圖中,我有MainFragment及其子FragmentAFragmentB 為什么我不能使用導航操作從其父級打開子級? 如果是, override fun createFragment(position: Int): Fragment需要返回一個 Fragment 並且findNavController().navigate()不返回任何內容。 我該怎么做呢?

您可以按照此示例代碼進行操作,這可能會對您有所幫助

class TvShowsFragment:片段(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()
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM