There are information that it is impossible to use ViewPager
within a Fragment
in many sources like "The Busy Coders Guide for Android Developers" by Mark Murphy, or posts like this on SO. I'm confused because I don't have such a problem and I successfully use ViewPager
within my Fragment
. The only distinction is that I instantiate a ViewPager
not in onCreateView()
method but in onActivityCreated()
. And everything works perfectly fine.
So the question is - may be I just don't know something and this is not recommended for some reason to make UI instantiations in onActivityCreated()
? But again - everything works just fine.
Here is the listing of the class and xml:
Class:
public class ViewPagerFragment extends Fragment {
static final int NUM_ITEMS = 2;
private ViewPagerAdapter mAdapter;
private ViewPager mPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.view_pager_fragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new ViewPagerAdapter(getFragmentManager());
mPager = (ViewPager) getView().findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
public static class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int num) {
if (num == 0) {
return new ItemsListFragment();
} else {
return new FavsListFragment();
}
}
@Override
public int getCount() {
return NUM_ITEMS;
}
}
}
Layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
To implement the View pager within a fragment use getChildFragmentManager() instead of getFragmentManager(). You can call setAdapter() for the ViewPager from onCreateView() or onActivityCreated(), that is not a matter.
I hope this will help you guys.
UPDATE: Since this answer was originally written, you now can have nested fragments, which means it is possible to have a
ViewPager
use fragments for pages and be in a fragment itself. This sample project demonstrates the technique.I now return you to your regularly-scheduled answer, presented in its entirety...
Quoting myself from the book:
Quoting Dianne Hackborn:
It is perfectly possible to put a
ViewPager
inside aFragment
, so long as the contents of theViewPager
do not themselves contain fragments. Since the concrete implementations ofPagerAdapter
supplied by the Android Support package use fragments, you have to roll your own fragment-lessPagerAdapter
to put theViewPager
in a fragment.I will endeavor to make this point clearer in the next edition of the book (unless you're British, in which case I'll endeavour to make this point clearer :-).
While Initializing the SetionPageAdapter for ViewPager use "getChildFragmentManager()".
it is possible try to do this code and save view_pager_fragment.xml
ViewPagerFragment