I have implemented something very similar: Previously I had four fragments in my ViewPager
, but then decided that I want to integrate two of those fragments more intimately by reducing the number of fragment that I can reach by sliding and switching back and forth between two fragments by using a button. The implementation took me a while, though. I did not manage to mess with the index of my fragmentList
properly. In the end, the trick was to take out those two fragments from the ViewPager
altogether and add a HolderFragment
instead. Within this fragment I implemented the fragment transaction for hiding one and showing the other fragment.
Here is the code from my HolderFragment:
public class HolderFragment extends Fragment {
private Context context;
private Fragment currentFragment;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_holder, container, false);
OneFragment oneFragment =
(OneFragment) Fragment.instantiate(context, OneFragment.class.getName());
OtherFragment otherFragment =
(OtherFragment) Fragment.instantiate(context, OtherFragment.class.getName());
// oneFragment selected on view creation
FragmentManager fm = this.getChildFragmentManager();
fm.beginTransaction().add(R.id.holder_fragment_holder, oneFragment).commit();
fm.beginTransaction().add(R.id.holder_fragment_holder, otherFragment).hide(mediaFragment)
.commit();
currentFragment = oneFragment;
return view;
}
public void switchFragments(Fragment fragment) {
if (!fragment.equals(currentFragment)) {
this.getChildFragmentManager().beginTransaction().hide(currentFragment).commit();
currentFragment = fragment;
this.getChildFragmentManager().beginTransaction().show(currentFragment).commit();
}
}
}
Then, whenever the switch button is pressed just call holderFragment.switchFragments(oneFragment)
or holderFragment.switchFragments(otherFragment)
from the activity that holds the ViewPager
(and a reference to the HolderFragment).