我的问题

根据Google的文档:


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

所以我创建了自己的PageFragment。我的PageFragmentAdapter包含3页PageFragment
我也有六个 fragment :Fragment1Fragment2Fragment3FragmentAFragmentBFragmentC
在我的MainActivity中,我初始化了六个 fragment ,我的ViewPager及其PageFragmentAdapter(它们自己初始化了三个PageFragment)。

然后,我使用此方法将Fragment1Fragment2Fragment3附加到PageFragment的每个页面(每个PageFragmentAdapter):
PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

我可以(通过PageFragmentAdapter中的方法)获取 fragment 并将“嵌套 fragment ”放入我的PageFragment中(当然,在onCreate()中),如下所示:
getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();

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

而且效果很好!
它可以帮助我(但不是这个故事)可以像下面这样简单地替换ViewPager中的 fragment :
tPageFragmentAdapter.replaceFirstPage(tFragmentA);

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



如您所见,PageFragmentAdapter可以销毁我的每个PageFragment,当然也可以销毁其嵌套 fragment 。并在重新创建它时将使用NULL而不是mFragment值。
我正在尝试通过getChildFragmentManager().putFragment()保存它,然后通过getChildFragmentManager().getFragment()获取它。但这是行不通的。

问题

所以我的问题是:如何将嵌套 fragment 保存在父 fragment 中?是否可以?

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

编辑

Thx @ AndroidBegin.com为答案!


@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);
    }
}

最佳答案

在您的 fragment 上尝试一下。

public class Fragment2 extends SherlockFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.viewpager_main, container, false);
        // Locate the ViewPager in viewpager_main.xml
        ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
        // Set the ViewPagerAdapter into ViewPager
        mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager()));
        return view;
    }

    @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);
        }
    }
}

资料来源:https://www.swipetips.com/actionbarsherlock-side-menu-navigation-nested-viewpager-fragment-tabs-tutorial/

09-25 22:31