views:

5497

answers:

4

I have been attempting to implement the 'advanced' tabwidget example from google. But, when it tries to call tabHost.addTab(spec); I get a stack trace from the debugger. Sorry, I don't have the stack trace here, but I'm wondering if others have had this same issue (as this code had a number of typo's and missing information that stopped me from even compiling.

Can anyone point me to a corrected/running version of this code?

The updated information needed are:

<activity android:name=".ArtistsActivity"></activity>
<activity android:name=".AlbumsActivity"></activity>
<activity android:name=".SongsActivity"></activity>
+3  A: 

The current TabHost Example on the Android Developers site contains one error and also leaves out an important step that will prevent the example from running.

First off: In the onCreate() method that is added to HelloTabWidget class attempts to use a TabHost object called mTabHost. This is invalid, it should be tabHost.

Second: The tutorial leaves out the details that you need to add each of the activities too the AndroidManifest.xml. Without this the code will not work and you will get "force close" each time you attempt to execute.

GrandPrix
I saw that alluded to elsewhere on another site. I'll track it down, modify and accept when I've verified. Thx.
KevinDTimm
The 'elsewhere' is http://code.google.com/p/android/issues/detail?id=4183, but I haven't checked it yet. Tonight, I hope.
KevinDTimm
@GrandPrix: OMG I wish Google would fix their examples. They are still wrong! And I had the exact same problem and it was driving me insane today. Thank you SO much for this answer. :)
Dave
+7  A: 

I spent the last hour or so going through that tutorial. Here's the problems and fixes for it that I dealt with:

Step 2: When creating your activities, if you do not create them through the manifest then you'll need to add them to the manifest manually.

Add these lines to AndroidManifest.xml:

  <activity android:name=".AlbumsActivity"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar">
        </activity>
  <activity android:name=".ArtistsActivity"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar">
        </activity>
          <activity android:name=".SongsActivity"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar">
        </activity>

Step 3: You are only instructed to create the ic_tab_artists.xml file. You'll need to create one for ic_tab_songs.xml and ic_tab_albums.xml as well. You can just duplicate the ic_tab_artists.xml (or change the HelloTabView.java tab specs to use the artists.xml file for each tab).

Step 4: The third to last line under /res/layout/main has a typo (a ; instead of a :)

      android:padding="5dp" />
    </LinearLayout>
</TabHost>

Step 6: There is a typo that uses calls mTabHost instead of tabHost. Change it.

As already cited the getIntent() function on the last line isn't appropriate. I just call the tab based on it's id. eg:

tabHost.setCurrentTabByTag("albums");
Ted
A: 

Also the

android:theme="@android:style/Theme.NoTitleBar"

does not work for me, if I replace it with

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

it works fine.

Marco Hertwig
A: 

The example, as corrected by Ted, also works if all three activities do not include the line: android:theme="@android:style/Theme.NoTitleBar" This is useful if you want a title bar in addition to the tab labels.

Lou