Androidでタブを使う方法について紹介します。
タブ(Tab)を簡単に使う仕組みとして専用のActivity「TabActivity」が用意されています。
※2010/11/14 yanzmさんよりご指摘いただき、内容を修正しました。ありがとうございました!
TabActivityで、タブの内容として表示できるのはView、Activity(IntentによるTabActivity内起動)、
動的にコンテンツを生成できるTabHost.TabContentFactoryです。
レイアウト構成の制限
TabActivityではレイアウトファイルについて、名前上の制限があります。
- TabWidgetのidが android:id=”@android:id/tabs” であること
- FrameLayoutのidが android:id=”@android:id/tabcontent”であること
上記の2つは、タブを使う上で固定のidとなっています。
続きはサンプルの res/layout/main.xml です。アウトラインは以下のような構成です。
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?> <TabHost android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/first_content" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="first_tab" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:id="@+id/second_content" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="second_tab" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost>
レイアウト上の注意
タブのレイアウトを考える上では、以下の構成に注意してください。
※2010/11/14 yanzmさんよりご指摘いただき下記内容を修正しました。ありがとうございました!
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="wrap_content" android:layout_height="wrap_content" >
LinearLayout で TabWidgetとFrameLayoutをくくって「android:orientation=”vertical”」を指定してください。
縦配置でタブ(TabWidget)の下に表示したい項目(FrameLayout)を並べます。
TabActivityの作成
TabActivityでは、TabHostとTabSpecがタブ作成のための重要な要素になります。順を追って
- 標準的なTabの追加方法
- TabにIconを設定する
- Tabを動的に生成する
について、説明します。
まずは、TabActivityとTabHostについてサンプルコードを抜粋しました。
public class tabAct extends TabActivity implements TabHost.TabContentFactory {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//TabActivityでは、getTabHostメソッドが使えます
TabHost tabHost = getTabHost();
・・・省略・・・
// 初期表示設定
tabHost.setCurrentTabByTag("First"); //tabHost.setCurrentTab(0)でもOK
通常は、extends Activityですが、今回はTabActivityを継承しています。TabActivityでは、タブ情報を持っているTabHostをgetTabHostメソッドで取得できます。
タブの追加方法
onCreateメソッド内部で処理します。tabHost.newTabSpecメソッドを使い、タブの詳細情報を設定します。
setContentView(R.layout.main);
・・・省略・・・
//子となるタブの設定
TabSpec firstTab = tabHost.newTabSpec("First");
firstTab.setIndicator("firstTab"); //タブ上の文字列
firstTab.setContent(R.id.first_content); //表示するView
tabHost.addTab(firstTab);
6行目でタブに表示される文字列、7行目で内容のViewを設定しています。
タブにアイコンを設定する
setIndicatorメソッドに、drawableを指定すればアイコンがタブに表示されます。
(タブの高さは固定で、アイコンの有無では変わりません)
//画像を使う場合
TabSpec secondTab = tabHost.newTabSpec("Second");
secondTab.setIndicator("secondTab", getResources().getDrawable(android.R.drawable.ic_menu_agenda)); // タブに表示する文字列と画像
secondTab.setContent(R.id.second_content); //表示するView
tabHost.addTab(secondTab);
タブを動的に生成する
最後はタブの中身を動的に生成します。
TabHost.TabContentFactoryを利用することで簡単に作れます。
public class tabAct extends TabActivity implements TabHost.TabContentFactory {
タブの設定時での違いは、setContentメソッドの引数がリソースではなく、TabActivityになるところ(4行目)です
//タブコンテンツのファクトリーを使う場合
TabSpec thirdTab = tabHost.newTabSpec("Third");
thirdTab.setIndicator("thirdTab"); //タブ上の文字列
thirdTab.setContent(this); //TabContentFactoryを設定、タブ選択時に表示するビューを生成
tabHost.addTab(thirdTab);
追加で、 TabHost.TabContentFactoryのcreateTabContentメソッドを実装します。
返値は、表示するViewです。サンプルではTextViewにタブのTag(名前)を設定して返しています。
public View createTabContent(String tag) {
TextView textView = new TextView(this);
textView.setText("Content for tab with tag " + tag);
return textView;
}
おつかれさまでした。