title: Replacing ViewPager with Fragment - Then Navigating Back
body: <p>I've got an activity which initially hosts a ViewPager, hooked up to a FragmentPagerAdapter.</p>
  
  <p>When the user clicks on an item inside the ViewPager's child fragment, I'm using a FragmentTransaction to replace an empty container view with a new Fragment which I want to navigate to.</p>
  
  <p>If I use addToBackStack() on the transaction, commit the transaction and then navigate back, I am not returned to the ViewPager's views (the initial layout).</p>
  
  <p>If I don't use addToBackStack() on the transaction, commit the transaction and then navigate back, the application exits.</p>
  
  <p>It seems apparent that the ViewPager is not added to the backstack (which is not that surprising as it isn't a fragment in itself).. But I would expect the default behaviour would be that the back press takes me back to that activities initial View (the ViewPager).</p>
  
  <p>Based on what I've read, it seems that perhaps because a fragment transaction is taking place, the ViewPager or PagerAdapter loses track of which fragment should be on display.</p>
  
  <p>I'm really confused with this, but I ended up creating a huge mess of code overriding the onBackPress and showing and hiding the viewpager views. I would've thought there is a simpler way to use default behaviours to perform the appropriate navigation.</p>
  
  <p>tl;dr</p>
  
  <p>A is a Viewpager hosting fragments.
  B is a new Fragment.</p>
  
  <p>When I replace A with B, and then press back, I expect to navigate back to A, but that is not happening.</p>
  
  <p>Any advice would be much appreciated.</p>
  
  <p>Code:</p>
  
  <p>MainActivity:</p>
  
  <pre><code>  @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
  
          headingLayout = (RelativeLayout) findViewById(R.id.headingLayout);
          headingLayout.setVisibility(View.GONE);
  
          // Set up the ViewPager, attaching the adapter and setting up a listener
          // for when the
          // user swipes between sections.
          mViewPager = (ViewPager) findViewById(R.id.pager);
  
          mViewPager.setPageMargin(8);
  
          /** Getting fragment manager */
          FragmentManager fm = getSupportFragmentManager();
  
          /** Instantiating FragmentPagerAdapter */
          MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);
  
          /** Setting the pagerAdapter to the pager object */
          mViewPager.setAdapter(pagerAdapter);
  .
  .
  .
  }
  
      public void onListItemClicked(Fragment fragment) {
          fromPlayer = false;
          InitiateTransaction(fragment, true);
  
      }
  
  
      public void InitiateTransaction(Fragment fragment, boolean addToBackStack) {
  
          invalidateOptionsMenu();
  
          FragmentManager fm = getSupportFragmentManager();
          FragmentTransaction ft = fm.beginTransaction();
  
          ft.replace(R.id.fragmentContainer, fragment).addToBackStack(null)
                  .commit();
  
      }
  </code></pre>
  
  <p>PagerAdapter:</p>
  
  <pre><code>package another.music.player;
  
  import android.os.Bundle;
  import android.support.v4.app.Fragment;
  import android.support.v4.app.FragmentManager;
  import android.support.v4.app.FragmentPagerAdapter;
  import another.music.player.fragments.AlbumListFragment;
  import another.music.player.fragments.ArtistListFragment;
  import another.music.player.fragments.SongListFragment;
  
  public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
  
      final int PAGE_COUNT = 3;
  
      /** Constructor of the class */
      public MyFragmentPagerAdapter(FragmentManager fm) {
          super(fm);
      }
  
      /** This method will be invoked when a page is requested to create */
      @Override
      public Fragment getItem(int i) {
          switch (i) {
          case 0:
              ArtistListFragment artistListFragment = new ArtistListFragment();
              Bundle artistData = new Bundle();
              artistData.putInt("current_page", i + 1);
              artistListFragment.setArguments(artistData);
              return artistListFragment;
  
          case 1:
              AlbumListFragment albumListFragment = new AlbumListFragment();
              Bundle albumData = new Bundle();
              albumData.putInt("current_page", i + 1);
              albumData.putBoolean("showHeader", false);
              albumListFragment.setArguments(albumData);
              return albumListFragment;
  
          default:
  
              SongListFragment songListFragment = new SongListFragment();
              Bundle songData = new Bundle();
              songData.putInt("current_page", i + 1);
              songListFragment.setArguments(songData);
              return songListFragment;
          }
      }
  
      /** Returns the number of pages */
      @Override
      public int getCount() {
          return PAGE_COUNT;
      }
  
      @Override
      public CharSequence getPageTitle(int position) {
          switch (position) {
          case 0:
              return "Artists";
  
          case 1:
              return "Albums";
  
          default:
              return "Songs";
          }
      }
  }
  </code></pre>
  
  <p>main xml (containing fragmentContainer &amp; ViewPager):</p>
  
  <pre><code>&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/main_layout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@drawable/app_background_ics" &gt;
  
      &lt;RelativeLayout
          android:id="@+id/headingLayout"
          android:layout_width="match_parent"
          android:layout_height="56dp" &gt;
      &lt;/RelativeLayout&gt;
  
      &lt;FrameLayout
          android:id="@+id/fragmentContainer"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_below="@+id/headingLayout" /&gt;
  
      &lt;android.support.v4.view.ViewPager
          android:id="@+id/pager"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent" &gt;
  
          &lt;android.support.v4.view.PagerTabStrip
              android:id="@+id/pager_title_strip"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:background="#33b5e5"
              android:paddingBottom="4dp"
              android:paddingTop="4dp"
              android:textColor="#fff" /&gt;
      &lt;/android.support.v4.view.ViewPager&gt;
  
  &lt;/RelativeLayout&gt;
  </code></pre>