我有和Navigating back to FragmentPagerAdapter -> fragments are empty一樣的問題,但希望對使用getChildFragmentManager()的解決方案做一些說明。getChildFragmentManager()和viewpager
此解決方案使用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被顯示,並且它的按鈕被點擊時,我想InnerFragment2替換爲InnerFragment3。我基本上想要使用inner_content作爲內部容器,並不斷向碎石堆添加碎片以獲得適當的後退行爲。
每次我添加到我的碎片堆棧時,getChildFragmentManager()或getFragmentManager()是什麼xml模式看起來像是因爲在我的outerfragment中有一個framelay沒有這樣做。