4

我有和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沒有這樣做。

回答

0
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); 
} 

我希望這會有所幫助。我有同樣的問題,碎片apear,但一旦你回去,他們消失,找到一個空的香味。在我更新片段管理器後,我完成了第一次實現的這條線,我可以享受免費的平滑滾動。