如何使用嵌套片段 (Android 4.2) 在 ViewPager 中添加片段 [英] How to add a Fragment inside a ViewPager using Nested Fragment (Android 4.2)

本文介绍了如何使用嵌套片段 (Android 4.2) 在 ViewPager 中添加片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有三个 FragmentsViewPager,每个都显示一个 List(或 Grid).

I have a ViewPager with three Fragments, each one shows a List (or Grid).

在新的 Android API 级别 17 (Jelly Bean 4.2) 中,其中一项功能是 嵌套片段.新功能描述说:

In the new Android API level 17 (Jelly Bean 4.2), one of the features is Nested Fragments. The new functionality description says:

如果您使用 ViewPager 创建左右滑动和占用大部分屏幕空间,您现在可以插入片段进入每个片段页面.

if you use ViewPager to create fragments that swipe left and right and consume a majority of the screen space, you can now insert fragments into each fragment page.

所以,如果我理解正确,现在我可以创建一个带有 Fragments(例如里面有一个按钮)的 ViewPager,当用户按下按钮时会显示另一个Fragment 使用这个新功能不会丢失 ViewPager.

So, if I understand right, now I can create a ViewPager with Fragments (with a button inside for example) inside, and when user press the button show another Fragment without loose the ViewPager using this new feature.

我花了一上午的时间试图以几种不同的方式实现这一点,但我无法让它发挥作用...有人可以添加一个简单的示例来说明如何实现这一点吗?

I've expended my morning trying to implement this several different ways, but I can´t get it working... Can somebody add a simple example of how to implement this?

PS:我只对这种方式感兴趣,用 getChildFragmentManager 来了解它是如何工作的.

PS: I'm only interested in doing at this way, with getChildFragmentManager to learn how works.

推荐答案

假设您已经创建了正确的 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/嵌套片段

这篇关于如何使用嵌套片段 (Android 4.2) 在 ViewPager 中添加片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆