且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使用嵌套片段(Android 4.2)在 ViewPager 中添加片段

更新时间:2023-02-11 10:56:45

假设您已经创建了正确的 xml 布局.现在在另一个 Fragment 托管的 ViewPager 中显示 Fragment 非常简单.

Assuming you have created the correct xml layouts. It is now very simple to display fragments in a ViewPager that is hosted by another Fragment.

以下是显示子片段的父片段:

The following is a parent fragment that displays child fragments:

class ParentViewPagerFragment : Fragment() {

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val root = inflater.inflate(R.layout.fragment_parent_viewpager, container, false)

    val viewPager = root.findViewById(R.id.viewPager) as ViewPager
    // Important: Must use the child FragmentManager or you will see side effects.
    viewPager.adapter = MyAdapter(childFragmentManager)

    val tabStrip = root.findViewById<TabLayout>(R.id.pagerTabStrip)
    tabStrip.setupWithViewPager(viewPager)

    return root
  }

  class MyAdapter internal constructor(fm: FragmentManager) : FragmentPagerAdapter(fm) {

    override fun getCount(): Int = 4

    override fun getItem(position: Int): Fragment {
      val args = Bundle().apply { putInt(ChildFragment.POSITION_KEY, position) }
      return ChildFragment.newInstance(args)
    }

    override fun getPageTitle(position: Int): CharSequence = "Tab $position"
  }

  companion object {
    val TAG: String = ParentViewPagerFragment::class.java.name
  }
}

在实例化 FragmentPagerAdapter 时使用 Fragment.getChildFragmentManager() 很重要.另请注意,您不能在子片段上使用 Fragment.setRetainInstance() ,否则会出现异常.为简洁起见,省略了导入.

It is important to use Fragment.getChildFragmentManager() when instantiating the FragmentPagerAdapter. Also note that you cannot use Fragment.setRetainInstance() on the children fragments or you'll get an exception. The imports were omitted for brevity.

源代码可以在以下位置找到: https://github.com/marcoRS/nested-fragments