ActionBar.TabもAndroid5.0で非推奨になったので、タブUIを実現する方法のひとつとしてFragmentTabHostがある・・・。
FragmentTabHost | Android Developers
FragmentTabHostはTabHostのcontent部分をFragmentにできるようにしたもの・・・。
標準のWidgetではなく、v4 Support Librariesの機能ではあるが、大抵の環境では普通にそのまま利用可能・・・。
fragment_tab.xmlとする・・・。
タブのコンテンツとなるフラグメント部分には、LinearLayoutの中にtab_textviewというTextViewだけ・・・。
(tools:contextのところ、本来はFragmentのクラス名を指定するんじゃなかったっけ・・・。これでも動くのか・・・。関係ないのか・・・。)
リソースを追加したら、今度はJavaソース・・・。
[Class]の追加・・・。
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つのタブになる・・・。
こんな感じで2つのタブ・・・。
そして、タブ1が選択されてるのでコンテンツ部分のテキストも"tab1"・・・。
タブ2を選択すると、
コンテンツ部分も"tab2"に変わる・・・。
もう一度タブ1に戻ると、
"tab1"に戻る・・・。
これ、タブを切り替えるたびにonCreateViewが呼ばれている(getArgumentsもタブごとに切り替わってる・・・。)ようなので、
おそらくFragmentTransaction.replaceに相当するみたい・・・。
ということはViewが維持されてないので、Viewを維持したいような場合には向かない・・・。
タブブラウザのようにWebViewのロード状態を維持したい場合とか・・・。
(Zincのとこでも触れたけど・・・。)
なのでそういう場合とかにはこれ以降に登場するタブ系Viewや非推奨になったはずのTabHostを使わないといけないのかな・・・。