2016-11-23 100 views
0

我有一個調用FragmentParent的活動。這包含一個viewpager。 viewpager有2個選項卡。在每個選項卡中都有一個片段。在第一個選項卡(TAB-A)中有一個包含Recyclerview的片段。當我點擊一個項目時,應用程序會打開新的片段,但是當我返回時,viewpager中的所有片段都會變空。將片段替換爲包含ViewPager的片段

我正在使用片段和支持庫v-13,我已經嘗試過使用v-4,但我遇到了同樣的問題。

這是我的代碼:

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/fragment_container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_test); 

    initWithFragments(savedInstanceState); 
} 

public void initWithFragments(Bundle savedInstanceState) { 

    if (findViewById(R.id.fragment_container) != null) { 

     if (savedInstanceState != null) { 
      return; 
     } 
     // Create a new Fragment to be placed in the activity layout 
     MainFragment mainFragment = new MainFragment(); 
     //Fragment transaction 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.add(R.id.fragment_container, mainFragment); 
     ft.commit(); 
    } 
} 

MainFragment

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_app, container, false); 

    //Enabled menu 
    setHasOptionsMenu(true); 

    // Initialize Toolbar and View Pager 
    toolbar = (Toolbar) rootView.findViewById(R.id.toolbar); 
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); 

    // Create the adapter that will return a fragment for each section 
    SectionsPageAdapter mSectionsPagerAdapter = new SectionsPageAdapter(getFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    ViewPager mViewPager = (ViewPager) rootView.findViewById(R.id.container_view_pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      switch (position) { 
       case 0: 
        toolbar.setTitle("Home"); 
        break; 
       case 1: 
        toolbar.setTitle("Downloads"); 
        break; 
       default: 
        break; 
      } 
     } 

     @Override 
     public void onPageSelected(int position) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 
    }); 

    // Set up tab layout 
    TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

    return rootView; 
} 

fragment_app

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="@dimen/appbar_padding_top" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:popupTheme="@style/AppTheme.PopupOverlay"> 

     </android.support.v7.widget.Toolbar> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/container_view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
</LinearLayout> 

這是FragmentA的viewpager

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/colorGrayLight" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin"> 

<LinearLayout 
    android:id="@+id/container_recycler" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="1"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/video_recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

</LinearLayout> 

另外我有個內ËPageAdapter

public class SectionsPageAdapter extends FragmentPagerAdapter { 

private int NUM_PAGES = 2; 

public SectionsPageAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    // getItem is called to instantiate the fragment for the given page. 
    // Return a PlaceholderFragment (defined as a static inner class below). 
    switch (position) { 
     case 0: 
      return SearchFragment.newInstance(); 
     case 1: 
      return DownloadFragment.newInstance(); 
     default: 
      return new Fragment(); 
    } 
} 

@Override 
public int getCount() { 
    return NUM_PAGES; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    switch (position) { 
     case 0: 
      return "Search"; 
     case 1: 
      return "Downloads"; 
    } 
    return null; 
} 

}

我使用FragmentTransaction更換片段......

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_container,settingFragment); 
    ft.addToBackStack(null); 
    ft.commit(); 

如果你們能幫助我,我會很感激 感謝

這是我想要的:

enter image description here

+0

我不是很確定的片段被允許或設計爲ViewPager容器。 – Chisko

+0

我想我必須使用getChildFragmentManager –

+0

您是否打算在橫向中使用屏幕並同時擁有ViewPager和Details Fragment? – Chisko

回答

0

我終於解決了使用getChildFragments:

我改用getChildFragmentManager的getFragmentManager。我傳遞給PageAdapter

SectionsPageAdapter mSectionsPagerAdapter = new SectionsPageAdapter(getChildFragmentManager()); 

在RecyclerView的視圖保持器的構造我創建了一個接口與所述活動(主容器)進行通信嵌套片段。使用這種方式,我可以在R.id.fragment_container

取代片段,我發現在這個環節的解決方案: Adding child Fragment to Parent Fragment withing a ViewPager in Android

1

變化FragmentA佈局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/colorGrayLight" 
     android:orientation="vertical" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin"> 

    <LinearLayout 
     android:id="@+id/container_recycler" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:weightSum="1"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/video_recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" /> 
    </LinearLayout> 
</FrameLayout> 

現在,當你用這個

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_container,settingFragment); 
    ft.addToBackStack(null); 
    ft.commit(); 

更換片段將採取R.id.fragment_containerFragmentA

+0

您的解決方案有效,但我不想在viewpager中顯示新片段。我想通過viewpager展示它。 –

+0

這很好,你終於解決了這個問題 – Pavya