読者です 読者をやめる 読者になる 読者になる

FragmentTabHost

ActionBar.TabもAndroid5.0で非推奨になったので、タブUIを実現する方法のひとつとしてFragmentTabHostがある・・・。

FragmentTabHost | Android Developers

FragmentTabHostはTabHostのcontent部分をFragmentにできるようにしたもの・・・。
標準のWidgetではなく、v4 Support Librariesの機能ではあるが、大抵の環境では普通にそのまま利用可能・・・。

f:id:BG1:20161210225658p:plain

[Android XML File]を追加・・・。

f:id:BG1:20161210225735p:plain

fragment_tab.xmlとする・・・。

タブのコンテンツとなるフラグメント部分には、LinearLayoutの中にtab_textviewというTextViewだけ・・・。
(tools:contextのところ、本来はFragmentのクラス名を指定するんじゃなかったっけ・・・。これでも動くのか・・・。関係ないのか・・・。)

リソースを追加したら、今度はJavaソース・・・。

f:id:BG1:20161210230632p:plain

[Class]の追加・・・。

f:id:BG1:20161210230716p:plain

Fragmentの派生、TabFragment・・・。
あ、これ標準のFragmentになってる・・・。
これは間違い・・・。

こっちのソースでは直してるけど、android.app.Fragmentじゃなくて、
android.support.v4.app.Fragmentが正しい・・・。
で、その派生のTabFragment・・・。
inflater.inflateでR.layout.fragment_tabをもとにviewを生成・・・。
getArgumentsで、Fragment追加時にMainActivitiyからもらった引数bundleを取り出し、nameをTextViewにセット・・・。

MainActivityのlayoutは、

FragmentTabHostがタブとコンテンツを管理していて、idにはAndroid既定のtabhostを使う・・・。
(オリジナルなidを付けないみたい・・・。なんかこういう決まりになってるみたい・・・。)
TabWidgetがタブの部分・・・。これも既定のtabsというid・・・。
上のFrameLayoutがよくわからない・・・。これも既定のtabcontentというidを使うらしい・・・。
(タブのレイアウト?・・・なのかな・・・。)
下のFrameLayoutはコンテンツの部分・・・。ここにTabFragmentが挿入される・・・。これはオリジナルのidとして"content"と付けた・・・。

でMainActivityでは、

findViewByIdでFragmentTabHostのtabHostを取得したら、tabHost.setupでFragmentとの紐づけをする・・・。
fragmentManagerとコンテンツ部分のidのR.id.contentを渡す・・・。
で、あとは1つ目のタブtab1を追加・・・。
tabHost.newTabSpecでTabSpecオブジェクトのtabSpec1をつくる・・・。
setIndicatorでタブの表示名をセット・・・。
Bundleで"name"をキーとして、コンテンツ部分に表示するテキスト"tab1"を渡す・・・。
tabHost.addTabでtabSpec1を追加・・・。
TabFragment.classとbundleも渡す・・・。
同様にtab2も追加・・・。
これでtab1, tab2と2つのタブになる・・・。

f:id:BG1:20161210233408p:plain

こんな感じで2つのタブ・・・。
そして、タブ1が選択されてるのでコンテンツ部分のテキストも"tab1"・・・。
タブ2を選択すると、

f:id:BG1:20161210234129p:plain

コンテンツ部分も"tab2"に変わる・・・。
もう一度タブ1に戻ると、

f:id:BG1:20161210234155p:plain

"tab1"に戻る・・・。

これ、タブを切り替えるたびにonCreateViewが呼ばれている(getArgumentsもタブごとに切り替わってる・・・。)ようなので、
おそらくFragmentTransaction.replaceに相当するみたい・・・。
ということはViewが維持されてないので、Viewを維持したいような場合には向かない・・・。
タブブラウザのようにWebViewのロード状態を維持したい場合とか・・・。
(Zincのとこでも触れたけど・・・。)
なのでそういう場合とかにはこれ以降に登場するタブ系Viewや非推奨になったはずのTabHostを使わないといけないのかな・・・。

Sample/android/FragmentTabHost/FragmentTabHost/src/FragmentTabHost at master · bg1bgst333/Sample · GitHub