Android fragments getChildFragmentManager()和viewpager

Android fragments getChildFragmentManager()和viewpager,android-fragments,android-viewpager,android-nested-fragment,Android Fragments,Android Viewpager,Android Nested Fragment,我有与相同的问题,但想澄清一下使用getChildFragmentManager()的解决方案 此解决方案使用getChildFragmentManager(),该管理器用于管理此片段内的片段(OuterFragment,具有viewpager)。InnerFragment是OuterFragment内部的页面。当有人单击InnerFragment中的listview时,我希望InnerFragment2替换InnerFragment。xml和片段管理器是什么样子的 fragment_outer

我有与相同的问题,但想澄清一下使用getChildFragmentManager()的解决方案

此解决方案使用getChildFragmentManager(),该管理器用于管理此片段内的片段(OuterFragment,具有viewpager)。InnerFragment是OuterFragment内部的页面。当有人单击InnerFragment中的listview时,我希望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>
InnerFragment显示为OuterFragment内部的一个片段,它具有viewpager。InnerFragment有一个列表视图,单击该视图时,应将InnerFragment替换为InnerFragment2

InnerFragment.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;
    }
}
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\u内容

不仅InnerFragment2应该替换InnerFragment2,而且当显示InnerFragment2并单击其按钮时,我希望InnerFragment2替换为InnerFragment3。我基本上希望使用内部内容作为内部容器,并不断向backbackback添加片段以实现适当的back行为

我是getChildFragmentManager()还是getFragmentManager()每次添加到片段backbackback时,xml模式是什么样子的,因为在outerfragment中有一个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);
}

我希望这有帮助。我也有同样的问题,碎片会脱落,但一旦你回去,它们就会消失,找到一个空的碎片。添加了我第一次实现的行,在更新片段管理器后,我可以享受免费的平滑滚动。

您决不能直接在
getItem()
调用之外实例化片段,否则当您添加新片段时,您将得到重叠的片段,但系统也重新创建了碎片。切勿将
列表
存储在FragmentPagerAdapter中。看见