title: TabHost with Fragments and FragmentActivity
body: <p>I'm working on an Android App and I want to use 3 tabs for navigation using Fragments for each tab, but I don't know how to create the structure for doing it.</p>
  
  <p>I want to add each fragment separately because each one is different, but I don't know where to add them in FragmentActivity.</p>
  
  <p>I have these files.</p>
  
  <p>tabs_layout.xml</p>
  
  <pre><code>&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_height="match_parent"
      android:layout_width="match_parent"&gt;
  
      &lt;TabHost android:id="@android:id/tabhost"
           android:layout_width="match_parent"
           android:layout_height="match_parent"&gt;
  
           &lt;LinearLayout
                  android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent" &gt;
  
               &lt;TabWidget
                  android:id="@android:id/tabs" 
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
               /&gt;
  
               &lt;FrameLayout
                   android:id="@android:id/tabcontent" 
                   android:layout_width="match_parent"
                   android:layout_height="match_parent"
  
               &gt;
  
                   &lt;FrameLayout
                       android:id="@+id/tabRateAPet" 
                       android:layout_width="match_parent"
                       android:layout_height="match_parent"
  
                   /&gt;
  
                   &lt;FrameLayout
                       android:id="@+id/tabViewMyRates" 
                       android:layout_width="match_parent"
                       android:layout_height="match_parent"
  
                   /&gt;
  
                   &lt;FrameLayout
                       android:id="@+id/tabViewGlobalRates" 
                       android:layout_width="match_parent"
                       android:layout_height="match_parent"
  
                   /&gt;
  
  
               &lt;/FrameLayout&gt;
          &lt;/LinearLayout&gt;
      &lt;/TabHost&gt;
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>TabsMain.java</p>
  
  <pre><code>import android.os.Bundle;
  import android.support.v4.app.Fragment;
  import android.support.v4.app.FragmentActivity;
  
  public class MainTabsActivity extends FragmentActivity {
  public static final String RATE_A_PET = "Rate a Pet";
  public static final String MY_RATES = "My Rates";
  public static final String GLOBAL_RATES = "Global Rates";
  
  @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.tabs_layout);
   }
  }
  </code></pre>
  
  <p>Tabs.java</p>
  
  <pre><code>import android.app.Activity;
  import android.os.Bundle;
  import android.support.v4.app.Fragment;
  import android.support.v4.app.FragmentManager;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.TabHost;
  import android.widget.TabHost.OnTabChangeListener;
  import android.widget.TabHost.TabSpec;
  import android.widget.TextView;
  
  public class Tabs extends Fragment implements OnTabChangeListener {
      private static final String TAG = "FragmentTabs";
      public static final String RATE_A_PET = "Rate a Pet";
      public static final String MY_RATES = "My Rates";
      public static final String GLOBAL_RATES = "Global Rates";
  
      private View mRoot;
      private TabHost mTabHost;
      private int mCurrentTab;
  
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
  //      super.onCreateView(inflater, container, savedInstanceState);
          mRoot = inflater.inflate(R.layout.tabs_layout, null);
          mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost);
          setupTabs();
          return mRoot;
      }
  
      private void setupTabs() {
          mTabHost.setup(); // important!
          mTabHost.addTab(newTab(RATE_A_PET, R.string.tabRateAPet, R.id.tabRateAPet));
          mTabHost.addTab(newTab(MY_RATES, R.string.tabViewMyRates, R.id.tabViewMyRates));
      }
  
      private TabSpec newTab(String tag, int labelId, int tabContentId) {
          Log.d(TAG, "buildTab(): tag=" + tag);
  
          View indicator = LayoutInflater.from(getActivity()).inflate(
                  R.layout.tab,
                  (ViewGroup) mRoot.findViewById(android.R.id.tabs), false);
          ((TextView) indicator.findViewById(R.id.text)).setText(labelId);
  
          TabSpec tabSpec = mTabHost.newTabSpec(tag);
          tabSpec.setIndicator(indicator);
          tabSpec.setContent(tabContentId);
          return tabSpec;
      }
  
  
      @Override
      public void onTabChanged(String tabId) {
          Log.d(TAG, "onTabChanged(): tabId=" + tabId);
          if (RATE_A_PET.equals(tabId)) {
              updateTab(tabId, R.id.tabRateAPet);
              mCurrentTab = 0;
              return;
          }
          if (MY_RATES.equals(tabId)) {
              updateTab(tabId, R.id.tabViewMyRates);
              mCurrentTab = 1;
              return;
          }
          if (GLOBAL_RATES.equals(tabId)) {
              updateTab(tabId, R.id.tabViewGlobalRates);
              mCurrentTab = 2;
              return;
          }
      }   
      private void updateTab(String tabId, int placeholder) {
          FragmentManager fm = getFragmentManager();
          if (fm.findFragmentByTag(tabId) == null) {
              fm.beginTransaction()
                      .replace(placeholder, new RateMyPetActivity(), tabId)
                      .commit();
          }
      }
  
  }
  </code></pre>