Trả lời

71

Bắt đầu từ Android 4.2, có các đoạn lồng nhau. http://developer.android.com/about/versions/android-4.2.html#NestedFragments Thư viện hỗ trợ hiện cũng bao gồm hỗ trợ cho các phiên bản Android cũ hơn này.

Vì vậy, bạn có thể làm một cái gì đó như thế này:

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager); 
    mViewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
    } 

Full thực hiện có sẵn ở đây: https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments

+0

Nhưng không thể vì tôi không thể đưa FragmentActivity vào trong Fragment 2 của tôi, bởi vì phần cha của fragmentActivity, và đứa trẻ (fragment 2) cần phải là fragmentActivity có các tab .. và trong ví dụ github không đặt một mảnh bên trong một đoạn khác. –

+0

Tại sao bạn thậm chí cần phải có đoạn 1? Bạn không thể chỉ có một viewpager tham khảo các mảnh khác nhau và sau đó có Fragment 2 bên dưới nó? –

+0

nhưng đoạn 1 luôn giống nhau và điều này sẽ giống như thay đổi, và không muốn điều đó .. một số ý tưởng? –

0

Với thư viện Android Hỗ trợ V4, bạn có thể thêm một đoạn trong đoạn khác. Hãy thử sử dụng nó, nó có thể giải quyết vấn đề của bạn.

+1

Nhưng là không thể vì i cant đặt một FragmentActivity bên trong Fragment tôi 2, bởi vì phụ huynh đoạn là một FragmentActivity, và đứa trẻ (đoạn 2) cần phải là một fragmentKích hoạt để có các tab .. một số ý tưởng? –

+0

Oh nhưng chờ đợi, bạn chỉ có thể đặt 2 đoạn thành một mảnh mà không có fragmentActivity, bạn biết không? Hoặc có thể bạn có lý do để làm điều đó ... –

0

Sau khi đọc một số ví dụ, bạn không thể có một FragmentActivity bên trong một fragmentActivity. Không cần thiết để có hai đoạn và điều này cần là một FragmentPageAdapter ... tôi chỉ cần làm điều này.

<android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" > 
</android.support.v4.view.ViewPager> 

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:gravity="center" 
     android:measureWithLargestChild="true" 
     android:orientation="horizontal" > 

<Button 
      android:id="@+id/first" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="First" > 
     </Button> 

<Button 
      android:id="@+id/last" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Last" > 
</Button> 
</LinearLayout> 

Nguồn: http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

18

Bạn phải sử dụng getChildFragmentManager() thay vì getSupportFragmentManager() để có được những FragmentManger bên trong một Fragment. Nhưng bạn không nên sử dụng FragmentStatePagerAdapter thay vì FragmentPagerAdapter.

+0

Cảm ơn, hãy làm việc với tôi! –

1

điều đó là có thể. cố gắng làm mã này view_pager_fragment.xml tập tin

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appBarLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

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

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

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

ViewPagerFragment

ViewPager viewPager; 
TabLayout tabLayout; 

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

    viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
    tabLayout = (TabLayout) view.findViewById(R.id.tab); 

    return view; 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    setupViewPager(viewPager); 
    tabLayout.setupWithViewPager(viewPager); 

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());`` 

    viewPagerAdapter.addFragment(new FirstFragment(), "First"); 
    viewPagerAdapter.addFragment(new SecoundFragment(), "Secound"); 
    viewPagerAdapter.addFragment(new LoginFragment(), "Login"); 

    viewPager.setAdapter(viewPagerAdapter); 
} 

private class ViewPagerAdapter extends FragmentPagerAdapter { 

    List<Fragment> fragmentList = new ArrayList<>(); 
    List<String> fragmentTitles = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragmentList.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return fragmentTitles.get(position); 
    } 

    public void addFragment(Fragment fragment, String name) { 
     fragmentList.add(fragment); 
     fragmentTitles.add(name); 
    } 
}