diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml
index 0f67c44ff..6d533c548 100644
--- a/samples/ApiDemos/AndroidManifest.xml
+++ b/samples/ApiDemos/AndroidManifest.xml
@@ -706,6 +706,14 @@
+
+
+
+
+
+
+
diff --git a/samples/ApiDemos/res/layout/action_bar_tab_content.xml b/samples/ApiDemos/res/layout/action_bar_tab_content.xml
new file mode 100644
index 000000000..c0aa7fade
--- /dev/null
+++ b/samples/ApiDemos/res/layout/action_bar_tab_content.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/samples/ApiDemos/res/layout/action_bar_tabs.xml b/samples/ApiDemos/res/layout/action_bar_tabs.xml
new file mode 100644
index 000000000..a51f46ef7
--- /dev/null
+++ b/samples/ApiDemos/res/layout/action_bar_tabs.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml
index 1a28a71a6..93f145dc1 100644
--- a/samples/ApiDemos/res/values/strings.xml
+++ b/samples/ApiDemos/res/values/strings.xml
@@ -567,6 +567,7 @@
App/Action Bar/Action Bar Mechanics
App/Action Bar/Action Bar Usage
+ App/Action Bar/Action Bar Tabs
Search
Add
@@ -587,6 +588,11 @@
Custom View!
Menu Item
+ Add new tab
+ Remove last tab
+ Toggle tab mode
+ Remove all tabs
+
diff --git a/samples/ApiDemos/src/com/example/android/apis/app/ActionBarTabs.java b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarTabs.java
new file mode 100644
index 000000000..48294a7b3
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarTabs.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.apis.app;
+
+import com.example.android.apis.R;
+
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * This demonstrates the use of action bar tabs and how they interact
+ * with other action bar features.
+ */
+public class ActionBarTabs extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.action_bar_tabs);
+ }
+
+ public void onAddTab(View v) {
+ final ActionBar bar = getActionBar();
+ final int tabCount = bar.getTabCount();
+ final String text = "Tab " + tabCount;
+ bar.addTab(bar.newTab()
+ .setText(text)
+ .setTabListener(new TabListener(new TabContentFragment(text))));
+ }
+
+ public void onRemoveTab(View v) {
+ final ActionBar bar = getActionBar();
+ bar.removeTabAt(bar.getTabCount() - 1);
+ }
+
+ public void onToggleTabs(View v) {
+ final ActionBar bar = getActionBar();
+
+ if (bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) {
+ bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);
+ } else {
+ bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+ bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
+ }
+ }
+
+ public void onRemoveAllTabs(View v) {
+ getActionBar().removeAllTabs();
+ }
+
+ /**
+ * A TabListener receives event callbacks from the action bar as tabs
+ * are deselected, selected, and reselected. A FragmentTransaction
+ * is provided to each of these callbacks; if any operations are added
+ * to it, it will be committed at the end of the full tab switch operation.
+ * This lets tab switches be atomic without the app needing to track
+ * the interactions between different tabs.
+ */
+ private class TabListener implements ActionBar.TabListener {
+ private TabContentFragment mFragment;
+
+ public TabListener(TabContentFragment fragment) {
+ mFragment = fragment;
+ }
+
+ @Override
+ public void onTabSelected(Tab tab, FragmentTransaction ft) {
+ ft.add(R.id.fragment_content, mFragment, mFragment.getText());
+ }
+
+ @Override
+ public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+ ft.remove(mFragment);
+ }
+
+ @Override
+ public void onTabReselected(Tab tab, FragmentTransaction ft) {
+ Toast.makeText(ActionBarTabs.this, "Reselected!", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+
+ private class TabContentFragment extends Fragment {
+ private String mText;
+
+ public TabContentFragment(String text) {
+ mText = text;
+ }
+
+ public String getText() {
+ return mText;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false);
+
+ TextView text = (TextView) fragView.findViewById(R.id.text);
+ text.setText(mText);
+
+ return fragView;
+ }
+
+ }
+}