title: Navigation drawer with tabhost and viewpager
body: <p>IVe implemented a Navigation drawer side menu with few fragments. For each fragment ive implemented different implementations. But for one fragment ive implemented <code>Tabhost</code> with <code>viewpager</code>. But the problem in facing is the <code>Tabhost</code> tabs content are visible on first click. But if you go back of the activity and come back to activity the tabs content are not visible. Instead of that <code>Tabhost</code> Linear Layout background is appearing.</p>
  
  <p>MainActivity</p>
  
  <pre><code> import java.util.ArrayList;
    import android.app.Activity;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.content.res.Configuration;
    import android.content.res.TypedArray;
    import android.os.Bundle;
    import android.support.v4.app.ActionBarDrawerToggle;
    import android.support.v4.widget.DrawerLayout;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
  
    public class MainActivity extends FragmentActivity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
  
   // nav drawer title
    private CharSequence mDrawerTitle;
  
  // used to store app title
   private CharSequence mTitle;
  
   // slide menu items
  
   private String[] navMenuTitles;
   private TypedArray navMenuIcons;
  
   private ArrayList&lt;NavDrawerItem&gt; navDrawerItems;
   private NavDrawerListAdapter adapter;
  
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      mTitle = mDrawerTitle = getTitle();
  
      // load slide menu items
      navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
  
      // nav drawer icons from resources
      navMenuIcons = getResources()
              .obtainTypedArray(R.array.nav_drawer_icons);
  
      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
      mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
  
      navDrawerItems = new ArrayList&lt;NavDrawerItem&gt;();
  
      // adding nav drawer items to array
      // Home
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
              .getResourceId(0, -1)));
      // Find People
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons
              .getResourceId(1, -1)));
      // Photos
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons
              .getResourceId(2, -1)));
      // Communities, Will add a counter here
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons
              .getResourceId(3, -1)));
      // Pages
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons
              .getResourceId(4, -1)));
      // What's hot, We will add a counter here
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons
              .getResourceId(5, -1)));
  
      // Recycle the typed array
      navMenuIcons.recycle();
  
      mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
  
      // setting the nav drawer list adapter
      adapter = new NavDrawerListAdapter(getApplicationContext(),
              navDrawerItems);
      mDrawerList.setAdapter(adapter);
  
      // enabling action bar app icon and behaving it as toggle button
      getActionBar().setDisplayHomeAsUpEnabled(false);
      getActionBar().setHomeButtonEnabled(true);
  
      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
              R.drawable.ic_drawer, // nav menu toggle icon
              R.string.app_name, // nav drawer open - description for
                                  // accessibility
              R.string.app_name // nav drawer close - description for
                                  // accessibility
      ) {
          public void onDrawerClosed(View view) {
              getActionBar().setTitle(mTitle);
              // calling onPrepareOptionsMenu() to show action bar icons
              getActionBar().setIcon(R.drawable.ic_drawer);
              invalidateOptionsMenu();
          }
  
          public void onDrawerOpened(View drawerView) {
              getActionBar().setTitle(mDrawerTitle);
              // calling onPrepareOptionsMenu() to hide action bar icons
              getActionBar().setIcon(R.drawable.ic_closeone);
              invalidateOptionsMenu();
          }
      };
      mDrawerLayout.setDrawerListener(mDrawerToggle);
  
      if (savedInstanceState == null) {
          // on first time display view for first nav item
          displayView(0);
      }
  }
  
  /**
   * Slide menu item click listener
   * */
  private class SlideMenuClickListener implements
          ListView.OnItemClickListener {
      @Override
      public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position,
              long id) {
          // display view for selected nav drawer item
          displayView(position);
      }
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
  }
  
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      // toggle nav drawer on selecting action bar app icon/title
      if (mDrawerToggle.onOptionsItemSelected(item)) {
          return true;
      }
      // Handle action bar actions click
      switch (item.getItemId()) {
      case R.id.action_settings:
          return true;
      case R.id.logo:
          return true;
      default:
          return super.onOptionsItemSelected(item);
      }
  }
  
  /* *
   * Called when invalidateOptionsMenu() is triggered
   */
  @Override
  public boolean onPrepareOptionsMenu(Menu menu) {
      // if nav drawer is opened, hide the action items
      boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
      menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
      return super.onPrepareOptionsMenu(menu);
  }
  
  /**
   * Diplaying fragment view for selected nav drawer list item
   * */
  private void displayView(int position) {
      // update the main content by replacing fragments
      Fragment fragment = null;
      switch (position) {
      case 0:
          fragment = new Home();
          break;
      case 1:
          fragment = new News();
          break;
      case 2:
          fragment = new Review();
          break;
      case 3:
          fragment = new Theaters();
          break;
      case 4:
          fragment = new Videos();
          break;
      case 5:
          fragment = new Photos();
          break;
  
      default:
          break;
      }
  
      if (fragment != null) {
          FragmentManager fragmentManager = getSupportFragmentManager();
          fragmentManager.beginTransaction()
                  .replace(R.id.frame_container, fragment).commit();
  
          // update selected item and title, then close the drawer
          mDrawerList.setItemChecked(position, true);
          mDrawerList.setSelection(position);
          setTitle(navMenuTitles[position]);
          mDrawerLayout.closeDrawer(mDrawerList);
      } else {
          // error in creating fragment
          Log.e("MainActivity", "Error in creating fragment");
      }
  }
  
  @Override
  public void setTitle(CharSequence title) {
      mTitle = title;
      getActionBar().setTitle(mTitle);
  }
  
  /**
   * When using the ActionBarDrawerToggle, you must call it during
   * onPostCreate() and onConfigurationChanged()...
   */
  
  @Override
  protected void onPostCreate(Bundle savedInstanceState) {
      super.onPostCreate(savedInstanceState);
      // Sync the toggle state after onRestoreInstanceState has occurred.
      mDrawerToggle.syncState();
  }
  
  @Override
  public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      // Pass any configuration change to the drawer toggls
      mDrawerToggle.onConfigurationChanged(newConfig);
  }
  
  }
  </code></pre>
  
  <p>ReviewFragment</p>
  
  <pre><code> import android.app.Activity;
   import android.os.Bundle;
   import android.support.annotation.Nullable;
   import android.support.v4.app.Fragment;
   import android.support.v4.app.FragmentManager;
   import android.support.v4.view.ViewPager;
   import android.util.Log;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;
   import android.widget.TabHost;
  
   public class Review extends Fragment  {
  
   private TabHost mTabHost;
   private ViewPager mViewPager;
   private TabsPagerAdapter mTabsAdapter;
  
  
   public Review(){}
  
  @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
           Bundle savedInstanceState) {
  
       View rootView = inflater.inflate(R.layout.review_layout, container, false);
  
       return rootView;
   }  
  
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onActivityCreated(savedInstanceState);
  
  
      mTabHost = (TabHost) getActivity().findViewById(android.R.id.tabhost);
      mTabHost.setup();
      Log.e("mTabHost", mTabHost + "");
  
      mViewPager = (ViewPager) getActivity().findViewById(R.id.pager);
      Log.e("mViewPager", mViewPager + "");
      mTabsAdapter = new TabsPagerAdapter(getActivity(), mTabHost, mViewPager);
  
      // Here we load the content for each tab. 
      mTabsAdapter.addTab(mTabHost.newTabSpec("Audience").setIndicator("Audience"), AudienceFragment.class, null);
      mTabsAdapter.addTab(mTabHost.newTabSpec("Critics").setIndicator("Critics"), CriticsFragment.class, null);
      Log.e("mTabsAdapter", mTabsAdapter + "");
     /* 
      if (savedInstanceState != null) {
          mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
      }*/
  }   
  }
  </code></pre>
  
  <p>TabsPagerAdapter</p>
  
  <pre><code>  import android.content.Context;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TabHost;
    import android.widget.TabWidget;
    import java.util.ArrayList;
  
    public class TabsPagerAdapter extends FragmentPagerAdapter
      implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
  private final Context mContext;
  private final TabHost mTabHost;
  private final ViewPager mViewPager;
  private final ArrayList&lt;TabInfo&gt; mTabs = new ArrayList&lt;TabInfo&gt;();
  
  static final class TabInfo
  {
      private final String tag;
      private final Class&lt;?&gt; clss;
      private final Bundle args;
  
      TabInfo(String _tag, Class&lt;?&gt; _class, Bundle _args)
      {
          tag = _tag;
          clss = _class;
          args = _args;
      }
  }
  
  static class DummyTabFactory implements TabHost.TabContentFactory
  {
      private final Context mContext;
  
      public DummyTabFactory(Context context)
      {
          mContext = context;
      }
  
      public View createTabContent(String tag)
      {
          View v = new View(mContext);
          v.setMinimumWidth(0);
          v.setMinimumHeight(0);
          return v;
      }
  }
  
  public TabsPagerAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager)
  {
      super(activity.getSupportFragmentManager());
      mContext = activity;
      mTabHost = tabHost;
      mViewPager = pager;
      mTabHost.setOnTabChangedListener(this);
      mViewPager.setAdapter(this);
      mViewPager.setOnPageChangeListener(this);
  }
  
  
  public void addTab(TabHost.TabSpec tabSpec, Class&lt;?&gt; clss, Bundle args)
  {
      tabSpec.setContent(new DummyTabFactory(mContext));
      String tag = tabSpec.getTag();
  
      TabInfo info = new TabInfo(tag, clss, args);
      mTabs.add(info);
      mTabHost.addTab(tabSpec);
      notifyDataSetChanged();
  }
  
  @Override
  public int getCount()
  {
      return mTabs.size();
  }
  
  @Override
  public Fragment getItem(int position)
  {
      TabInfo info = mTabs.get(position);
  
      return Fragment.instantiate(mContext, info.clss.getName(), info.args);
  
  }
  
  public void onTabChanged(String tabId)
  {
      int position = mTabHost.getCurrentTab();
      mViewPager.setCurrentItem(position);
  
  }
  
  public String getTag()
  {           
      return mTabHost.getCurrentTabTag();
  }
  
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
  {
       int pos = this.mViewPager.getCurrentItem();
       this.mTabHost.setCurrentTab(pos);
  }
  
  public void onPageSelected(int position)
  {
      // Unfortunately when TabHost changes the current tab, it kindly
      // also takes care of putting focus on it when not in touch mode.
      // The jerk.
      // This hack tries to prevent this from pulling focus out of our
      // ViewPager.
      TabWidget widget = mTabHost.getTabWidget();
      int oldFocusability = widget.getDescendantFocusability();
      widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
      mTabHost.setCurrentTab(position);
      widget.setDescendantFocusability(oldFocusability);
  }
  
  public void onPageScrollStateChanged(int state)
  {
  }
  }
  </code></pre>