getChildFragmentManager()和viewpager

时间:2014-10-03 02:24:48

标签: android-fragments android-viewpager android-nested-fragment

我遇到与Navigating back to FragmentPagerAdapter -> fragments are empty相同的问题,但想澄清使用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>

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有一个listview,点击后,应该用InnerFragment2替换InnerFragment。

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并单击它的按钮时,我想用InnerFragment3替换InnerFragment2。我基本上想要使用inner_content作为内部容器,并继续向backstack添加片段以获得适当的反向行为。

每次添加到我的片段backstack时,是否getChildFragmentManager()或getFragmentManager(),xml模式看起来是什么样的,因为在我的外部片段中有一个framelayout不会这样做。

1 个答案:

答案 0 :(得分:0)

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// If row is deleted, remove it from the list.
if (editingStyle == UITableViewCellEditingStyleDelete) {
    [toDoList removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

我希望这会有所帮助。我有同样的问题,其中碎片是apear但是一旦你回去他们消失,并找到一个空的fragent。继续我最初实现的那条线,在更新片段管理器后,我能够享受免费的平滑滚动。