我有与Navigating back to FragmentPagerAdapter -> fragments are empty相同的问题,但想对使用getChildFragmentManager()的解决方案进行一些说明。
此解决方案使用getChildFragmentManager(),此Fragment(OuterFragment,具有viewpager)中的片段管理器。 InnerFragment是OuterFragment内的页面。当有人单击InnerFragment中的列表视图时,我希望InnerFragment2替换InnerFragment。 xml和片段管理器是什么样的?
fragment_outer.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vpPager"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_header"
android:layout_gravity="top"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:paddingBottom="4dp"
android:paddingTop="4dp" />
<FrameLayout
android:id="@+id/inner_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.view.ViewPager>
OuterFragment.java:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_outer, container, false);
vpPager = (ViewPager) v.findViewById(R.id.vpPager);
FragmentManager cfManager = getChildFragmentManager();
adapterViewPager = new MyPagerAdapter(cfManager);
vpPager.setAdapter(adapterViewPager);
return v;
}
public static class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return 2;
}
// Returns the fragment to display for that page
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return InnerFragment.newInstance(false);
case 1:
return InnerFragment.newInstance(true);
default:
return null;
}
}
InnerFragment显示为OuterFragment内部的片段,该片段具有viewpager。 InnerFragment具有一个列表视图,单击该列表时应将InnerFragment替换为InnerFragment2。
InnerFragment.java:
FragmentManager fm = getChildFragmentManager();
fm = fm.beginTransaction();
ft.addToBackStack(null);
ft = ft.replace(R.id.inner_content,
InnerFragment2.newInstance(someArg));
ft.commit();
这将引发错误,指出InnerFragment2无法识别视图R.id.inner_content。
InnerFragment2不仅应替换InnerFragment,而且在显示InnerFragment2并单击按钮时,我希望将InnerFragment2替换为InnerFragment3。我基本上想将inner_content用作内部容器,并继续将片段添加到Backstack中以实现适当的返回行为。
每次添加到片段后堆栈时,我是否都要使用getChildFragmentManager()或getFragmentManager(),因此xml模式是什么样的,因为在我的外部片段中没有一个framelayout会这样做。
最佳答案
public void setupViewPager(ViewPager viewPager) {
FragmentManager cfManager=getChildFragmentManager();
viewPagerAdapter = new ViewPagerAdapter(cfManager);
// viewPagerAdapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager());
viewPagerAdapter.addFragment(new EntertainmentWallpaperFragment(), getString(R.string.title_entertainment_wallpapers));
viewPagerAdapter.addFragment(new EntertainmentMusicFragment(), getString(R.string.title_entertainment_music));
viewPagerAdapter.addFragment(new EntertainmentGamesFragment(), getString(R.string.title_entertainment_games));
viewPagerAdapter.addFragment(new EntertainmentEBooksFragment(), getString(R.string.title_entertainment_ebooks));
viewPagerAdapter.addFragment(new EntertainmentAppsFragment(), getString(R.string.title_entertainment_apps));
viewPager.setAdapter(viewPagerAdapter);
}
我希望这有帮助。我在碎片出现的地方也遇到了同样的问题,但是一旦返回,它们就会消失并找到一个空的炸药。表示我最初实现的那行,在更新了片段管理器之后,我可以享受自由流畅的滚动。