Adding Tabs Dynamically



The TabWidget in Android is set up to allow you to easily define tabs at compile time. However, sometimes, you want to add tabs to your activity during runtime. For example, imagine an email client where individual emails get opened in their own tab, for easy toggling between messages. In this case, you don’t know how many tabs or what their contents will be until runtime, when the user chooses to open a message.

Fortunately, Android also supports adding tabs dynamically at runtime, and this blog post will show you how.

For compile-time-defined tabs, in your Java code, to set up tabs with contents provided in layout XML, you simply create a TabHost.TabSpec object and call setContent() on it, with the widget ID of the tab’s contents:

[sourcecode language='java']
TabHost.TabSpec spec=tabs.newTabSpec(“buttontab”);

spec.setContent(R.id.buttontab);
spec.setIndicator(“Button”);
tabs.addTab(spec);
[/sourcecode]

Adding tabs dynamically at runtime works much the same way, except you use a different flavor of setContent(), one that takes a TabHost.TabContentFactory instance. This is just a callback that will be invoked — you provide an implementation of createTabContent() and use it to build and return the View that becomes the content of the tab.

Let’s take a look at an example.

First, here is some layout XML for an activity that sets up the tabs and defines one tab, containing a single button:

[sourcecode language='xml']

android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:paddingTop=”62px”>

About the Author

Mark MurphyMark Murphy is the founder of CommonsWare and is the author of _The Busy Coder's Guide to Android Development_, _The Busy Coder's Guide to *Advanced* Android Development_, and _Android Programming Tutorials_.View all posts by Mark Murphy →