ViewPager具有嵌套片段?

问题描述 投票:6回答:1

我的问题

根据Google的文档:

您现在可以将片段嵌入片段中。这对于您想放置动态且可重复使用的各种情况将UI组件转换为本身是动态的,可重复使用。例如,如果使用ViewPager创建的片段,则>向左和向右滑动并占用屏幕的大部分空间,您现在可以将片段插入每个片段页面。要嵌套片段,只需在您要在其中的片段上调用getChildFragmentManager()要添加一个片段。这将返回一个FragmentManager,您可以像平常一样使用顶级活动来创建零碎交易。例如,下面的代码添加了一个现有Fragment类中的片段:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

所以我创建了自己的PageFragment。我的PageFragmentAdapter由3页的PageFragment组成。我也有六个片段:Fragment1Fragment2Fragment3FragmentAFragmentBFragmentC。在我的MainActivity中初始化我的六个片段,我的ViewPager和它的PageFragmentAdapter(为其自身初始化三个PageFragment)。

然后我使用这种方法将我的Fragment1Fragment2Fragment3附加到PageFragment的每一页(每个PageFragmentAdapter):

PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

我可以获取(通过PageFragmentAdapter中的方法)片段,并将“嵌套片段”放入我的PageFragment(当然是onCreate()中),如:

getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();

注意:我使用PageFragment.setNestedFragment()在其中设置mFragment

而且效果很好!这将帮助我(但不是这个故事),只需替换ViewPager中的片段,例如:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

但是我有一个大问题。再次是Google的文档:

PagerAdapter的实现,将每个页面表示为一个片段只要用户持续将其永久保存在片段管理器中可以返回页面。此版本的寻呼机最适合在以下情况下使用通常会有少数静态片段要分页通过,例如一组标签。 每个页面的用户片段

访问将保留在内存中,尽管其视图层次可能是在不可见时被破坏。这可能导致使用大量内存量,因为片段实例可以保持任意状态量。

您可以看到,PageFragmentAdapter可以销毁我的每个PageFragment,当然也可以销毁其嵌套片段。并且当将重新创建它时,它将具有NULL而不是mFragment值。我正在尝试通过getChildFragmentManager().putFragment()保存它,然后通过getChildFragmentManager().getFragment()获取它。但这不起作用。

问题

所以我的问题是:如何将嵌套片段保存在父片段中?有可能吗?

非常感谢您的帮助。亚历克斯附言非常抱歉我的英语:)

编辑

谢谢@ AndroidBegin.com的答案!

这似乎是新添加的对嵌套的支持中的错误碎片。基本上,子FragmentManager的结尾是断点与活动分离时的内部状态。短期的解决该问题的方法是将以下内容添加到onDetach()您在以下位置调用getChildFragmentManager()的每个片段的位置:

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

我的问题,根据Google的文档:您现在可以将片段嵌入片段中。这在需要放置动态且可重复使用的UI的各种情况下非常有用...

android android-fragments nested android-viewpager fragmentpageradapter
1个回答
12
投票

在您的片段上尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.