2010年04月10日

[Android] TabActivityのタブをスライドさせられないか

Androidを触ったことのある方ならTabActivityという便利なものをご存知かと思います。
TabActivityとは、複数のアクティビティを1つの画面にまとめて、タブで管理してくれるものです。
大変素晴らしいと思います。

ただ、タブが表示される幅は固定のようで、あまり多くタブを作ってしまうと1つ1つのタブが縮小されていってしまいます。
そのため、いくつもいくつもActivityを追加できません。
また、タブの部分に横幅の広いもの(長いテキストとか)を設定したい場合も見た目的になかなか納得いかない状況に陥ったりすることがあると思います。

そんなとき、タブのエリアだけ左右にスクロールできないかな?と考えました。
Googleさんのことですので、きっとそんな機能を提供するためのプロパティがあるはずだ、と。
きっと setなんとかかんとか(true); とかするだけで、スクロール対応するはずだ、と。
で、ちょっと調べてみたのですが、なさそうでした…。

本当に機能がないのか調べるためにTabHostとかTabWidgetのソースも見てみました。
ざっくりとは↓こんな感じの構造っぽいです(本当にざっくりです)。

TabActivity
└TabHost
 ├TabWidget … タブの部分
 └各Activity

で、TabWidgetが何者かと言いますと、LinearLayoutを継承したクラスになっていました。
なので、横にタブが並ぶわけですね。
TabWigetの親ViewがHorizontalScrollViewなら左右にスクロールしてくれるのですが、TabWigetの親ViewはTabHost。
残念ながらTabHostはFrameLayoutを継承していて、HorizontalScrollViewではないので、左右へのスクロールはしない、ということが分かりました。
(確認はSDK1.6のソースで行いました)


ま、ここで誰もが思いつくと思います。
「それなら、HorizontalScrollViewを足せばいんじゃね」ということです。
つまり↓こういうこと。

TabActivity
└TabHost
 ├HorizontalScrollView
 │└TabWidget … タブの部分
 └各Activity

TabWidgetとTabHostの間にHorizontalScrollViewを挟んでしまえば良いのではないかと。
実際に試してみたらできました。あっさりと。

scrolltab1.png scrolltab2.png

今回は動きさえ確認できれば良かったので、文字しか設定していません。
標準の文字だけを表示するタブは、こんな状況を想定していない(だろう)せいか、文字の左右にスペースがなくて、だいぶカッコ悪いことになってますね。
ちゃんとしたものを作ろうと思ったら、自分でつくったViewを設定した方が良さそうです。
(TabSpecのsetIndicator()にはViewも設定できますし)

タブの部分を潰さずにスクロール表示したいって需要はあんまりないのかな。
↓いつも通り確認に使用したサンプルを置いておきます。
ScrollTabActivity.zip
posted by t2low at 23:32| Android