今回は、FragmentでTabActivityっぽいものを作る方法について書いていきます。
なぜTabActivityを使わないかと言うと、Android3.0から非推奨になってしまったからです・・・
こちらを参考にしました。
新たにTabを制作する場合は参考サイトをご覧ください。今から書くことは、
TabActivityからの移行方法になります。
まず、今までTabActivityを継承していたクラスを、FragmentActivityを継承するように変更します。
次に、レイアウトを以下のように変更してください。
<android.support.v4.app.FragmentTabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget
android:id="@android:id/tabs"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0"/>
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
</android.support.v4.app.FragmentTabHost>
次に、これまでActivityを継承していた(Tabに入れていた)クラスを、Fragment継承に変更します。ここで、Fragmentのライフサイクルに注意が必要です。
こちらに詳しく書いてあるので、一度ご覧ください。
特に注意したいのは、再びTabを開く時はonCreateViewからだということです。
また、再び開く時は新たにViewを獲得し、それを返す必要があります。
レイアウト内のボタンなどを設定したい場合viewを経由して行なってください。以下が例となります。
/**
* 追加メソッド
*
* @param inflater
* @param container
* @param savedInstanceState
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 第3引数のbooleanは"container"にreturnするViewを追加するかどうか
// trueにすると最終的なlayoutに再度、同じView groupが表示されてしまうのでfalseでOKらしい
mMyView = inflater.inflate(R.layout.webbrowser, container, false);
// テキストの設定
mtextUrl = (EditText) mMyView.findViewById(R.id.urlBar);
return mMyView;
}
基本的な内容はonCreateViewメソッドに書くことになります。
最後に、Tabを管理しているFragmentActivityを継承しているクラスの記述です。基本的にはTabActivityと変わりません。
mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
mTabHost.setup(this,getSupportFragmentManager(),R.id.content);
mTabHost.addTab(setTab( タグ,タブ名),なんとか.class,null);
mTabHost.addTab(setTab( タグ,タブ名),なんとか.class,null);
/**
* タブのセッター
*
* @param tag
* @param indicator
* @return
*/
private TabSpec setTab( String tag, String indicator) {
TabSpec spec = mTabHost.newTabSpec(tag);
//画像とかでもいいし、ボタンでもいい
spec.setIndicator(indicator);
return spec;
}
以上で以降が完了します。色々なイベントについては他のページでまとめます。