XOOM(Android 3.0)で開発やってます。タブレットは画面がでかいので、左右のペインを作って色々できるようなアプリをやろうとしていたわけですが、そのペインの片方でタブレイアウトを使いたかったのですが、TabHostはレイアウト上でRootViewでないといけないというルールがあるので、ペインを分けた時点でどうしたらいいんだろうか?と思い、数日悩んでいました。
フラグメントを使うのかなーと思ったのですが、ややこしくてわからんなぁと思っていて四苦八苦していたところ、@tama_eguchi さんに、API DemoのTargetSDKを11にしてインストールして、App > Action Bar > Action Bar Tabsというのがあることを教えて頂きました。
英語のサイトでも、タブはAction Barに置き換えられると書かれていて、普通にActionBarのメニューボタンにして使えという意味かと思っていたのですが、違いました。Action Barにタブが設置できるということでした。まさかAction Barがそんなに多機能になっていたとは!?
この下のソースだとタブを1つしか設定していないので、複数設定したときはどうかってのはまだわかりませんが、とりあえずAction Bar上にタブを表示し、タブを選択したら処理が走ることが確認できました。
参考にしたソースはAPI DemosのActionBarTabs.javaです。
// ActivityのonCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Action Barにタブを追加する
final ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
bar.addTab(
bar.newTab()
.setText(R.string.tab_name)
.setTabListener(new HogeTabListener(new HogeFragment()))
);
}
private class HogeTabListener implements ActionBar.TabListener {
private HogeFragment mFragment;
public HogeTabListener(HogeFragment fragment) {
mFragment = fragment;
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
/** タブが選択されたときの処理 */
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// leftPaneにmFragmentのレイアウトを追加する
ft.add(R.id.leftPane, mFragment, mFragment.getText());
}
/** タブの選択が移ったときの処理 */
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(mFragment);
}
}
private class HogeFragment extends Fragment {
private String mText;
public HogeFragment() {
mText = "HogeFragment";
}
public String getText() {
return mText;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragView = inflater.inflate(R.layout.hoge, container, false);
// 色々なイベント設定とかここでやる。
TextView text = (TextView) fragView.findViewById(R.id.text);
text.setText(R.string.hoge);
return fragView;
}
}