我的问题
根据Google的文档:
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
所以我创建了自己的
PageFragment
。我的PageFragmentAdapter
包含3页PageFragment
。我也有六个 fragment :
Fragment1
,Fragment2
,Fragment3
,FragmentA
,FragmentB
,FragmentC
。在我的
MainActivity
中,我初始化了六个 fragment ,我的ViewPager
及其PageFragmentAdapter
(它们自己初始化了三个PageFragment
)。然后,我使用此方法将
Fragment1
,Fragment2
和Fragment3
附加到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/