2016-11-23 76 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