How to set a ViewPager inside a Fragment
Starting in Android 4.2, there are nested fragments.http://developer.android.com/about/versions/android-4.2.html#NestedFragments The support library now also includes support for this for older Android versions.
So you can do something like this:
@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 implementation available here: https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments
You must use getChildFragmentManager()
instead of getSupportFragmentManager()
to get the FragmentManger
inside a Fragment.But you should not use FragmentStatePagerAdapter
rather than FragmentPagerAdapter
.
Just use getChildFragmentManager() instead of getSupportFragmentManager() inside Fragments.
Inside Fragments
new ViewPagerAdapter(getChildFragmentManager());
Inside Activity
new ViewPagerAdapter(getSupportFragmentManager());
Simple Code
fragment_sample.xml
layout
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.google.android.material.tabs.TabLayout android:id="@+id/tablayout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <androidx.viewpager.widget.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /></LinearLayout>
SampleFragment.java
class
public class SampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragmentView = inflater.inflate(R.layout.fragment_sample, container, false); return fragmentView; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // find views by id ViewPager viewPager = view.findViewById(R.id.viewpager); TabLayout tabLayout = view.findViewById(R.id.tablayout); // attach tablayout with viewpager tabLayout.setupWithViewPager(viewPager); ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); // add your fragments adapter.addFrag(new SampleFragment(), "Tab1"); adapter.addFrag(new SampleFragment2(), "Tab2"); adapter.addFrag(new SampleFragment3(), "Tab3"); // set adapter on viewpager viewPager.setAdapter(adapter); }}
ViewPagerAdapter.java
class
// common adapter for all view pager in your project.public class ViewPagerAdapter extends FragmentStatePagerAdapter { private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } public void addFrag(Fragment fragment) { mFragmentList.add(fragment); mFragmentTitleList.add(""); } public void addFrag(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); }}
Important Related Links