title: Tabhost nullpointerexception when tabhost isn't the only thing in the layout
body: <p>I've noticed that there are numerous issues with using tabhost, but none of them really fit my issue.  I am trying to create a view with an <a href="https://github.com/johannilsson/android-actionbar" rel="nofollow">action bar</a> on top, then a row of tabs under the bar.  Here's my activity layout.</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      style="@style/Dashboard"&gt;
  
      &lt;com.ftni.common.ui.ActionBar
          android:id="@+id/actionbar"
          style="@style/ActionBar"/&gt;
  
      &lt;TabHost android:id="@android:id/tabhost"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
          &lt;LinearLayout
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:padding="5dp"&gt;
              &lt;TabWidget
                  android:id="@android:id/tabs"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content" /&gt;
              &lt;FrameLayout
                  android:id="@android:id/tabcontent"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:padding="5dp" /&gt;
          &lt;/LinearLayout&gt;
      &lt;/TabHost&gt;
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>Next, we have my activity declared as such</p>
  
  <pre><code>public class DashboardActivity extends TabActivity {
  </code></pre>
  
  <p>and I am building my tabs like this.</p>
  
  <pre><code>private void buildTabs()
  {
      Resources res = getResources(); // Resource object to get Drawables
      TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);  // The activity TabHost
      TabHost.TabSpec spec;  // Resusable TabSpec for each tab
      Intent intent;  // Reusable Intent for each tab
  
      // Create an Intent to launch an Activity for the tab (to be reused)
      intent = new Intent().setClass(this, StatementsActivity.class);
  
      // Initialize a TabSpec for each tab and add it to the TabHost
      spec = tabHost.newTabSpec("statements").setIndicator("Statements",
                        res.getDrawable(R.drawable.ic_tab_active))
                    .setContent(intent);
      tabHost.addTab(spec);
  
      // Do the same for the other tabs
      intent = new Intent().setClass(this, PaymentsActivity.class);
      spec = tabHost.newTabSpec("payments").setIndicator("Payments",
                        res.getDrawable(R.drawable.ic_tab_active))
                    .setContent(intent);
      tabHost.addTab(spec);
  
      tabHost.setCurrentTab(0);
  }
  </code></pre>
  
  <p>when I tried using <code>getTabHost();</code> it was always returning a null.  So, I switched to <code>TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);</code> which does not return a null tabhost, but <code>tabHost.addTab(spec);</code> still causes a null pointer exception.</p>
  
  <p>And here is the stacktrace</p>
  
  <pre><code>04-26 19:50:12.494: ERROR/AndroidRuntime(7367): FATAL EXCEPTION: main
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ftni.consumer/com.ftni.consumer.ui.DashboardActivity}: java.lang.NullPointerException
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.os.Handler.dispatchMessage(Handler.java:99)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.os.Looper.loop(Looper.java:123)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.ActivityThread.main(ActivityThread.java:3647)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at java.lang.reflect.Method.invokeNative(Native Method)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at java.lang.reflect.Method.invoke(Method.java:507)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at dalvik.system.NativeStart.main(Native Method)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367): Caused by: java.lang.NullPointerException
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.widget.TabHost.addTab(TabHost.java:212)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at com.ftni.consumer.ui.DashboardActivity.buildTabs(DashboardActivity.java:75)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at com.ftni.consumer.ui.DashboardActivity.onCreate(DashboardActivity.java:29)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
  04-26 19:50:12.494: ERROR/AndroidRuntime(7367):     ... 11 more
  </code></pre>
  
  <p>Line 75 is the first <code>tabHost.addTab(spec);</code></p>
  
  <p>Also, all my activities are declared in my manifest.</p>
  
  <pre><code>&lt;activity android:name=".ui.DashboardActivity"&gt;&lt;/activity&gt;
  &lt;activity android:name=".ui.StatementsActivity"&gt;&lt;/activity&gt;
  &lt;activity android:name=".ui.PaymentsActivity"&gt;&lt;/activity&gt;
  </code></pre>
  
  <p>EDIT:</p>
  
  <p>Just to prove it isn't an issue, I removed the actionbar, put the layout to exactly what is in the tutorial, and I still get a null returned from <code>getTabHost();</code></p>
  
  <p>EDIT 2:
  full class code for clarity</p>
  
  <pre><code>public class DashboardActivity extends TabActivity {
      private ProfileModel profile;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          profile = Controller.getProfile();
  
          setContentView(R.layout.dashboard);
  
          buildTabs();
  
          new LoadDashboardTask().execute();
      }
  
      @Override
      public void onContentChanged()
      {
          ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
          if (actionBar != null)
          {
              actionBar.setOnTitleClickListener(new OnClickListener() {
                  public void onClick(View v) {
                      //do nothing for now.  User is already "home"
                  }
              });
  
              if(profile.Accounts.length == 1)
                  actionBar.setTitle(profile.Accounts[0].Name);
              else
                  actionBar.setTitle(profile.Name);
  
          }
      }
  
      private void buildTabs()
      {
          Resources res = getResources(); // Resource object to get Drawables
          TabHost tabHost = getTabHost();// The activity TabHost
  
          if(tabHost != null)
          {
              // Initialize a TabSpec for each tab and add it to the TabHost
              TabSpec statementSpec = tabHost.newTabSpec("statements").setIndicator("Statements",
                                res.getDrawable(R.drawable.ic_tabs_statements))
                            .setContent(new Intent().setClass(DashboardActivity.this, StatementsActivity.class));
              tabHost.addTab(statementSpec);
  
              TabSpec paymentSpec = tabHost.newTabSpec("payments").setIndicator("Payments",
                                res.getDrawable(R.drawable.ic_tabs_payments))
                            .setContent(new Intent().setClass(DashboardActivity.this, PaymentsActivity.class));
              tabHost.addTab(paymentSpec);
  
              tabHost.setCurrentTab(0);
          }
      }
  
      private class LoadDashboardTask extends AsyncTask&lt;Void, Void, Void&gt; {
          @Override
          protected void onPreExecute()
          {
              ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
              actionBar.setProgressBarVisibility(View.VISIBLE);
          }
  
          @Override
          protected Void doInBackground(Void... params) 
          {
              return null;
          }
  
          @Override
          protected void onPostExecute(Void result)
          {
              ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
              actionBar.setProgressBarVisibility(View.GONE);
          }
      }
  }
  </code></pre>