タブ画面作成(Android2.x以上)

タブ画面をActionBarで作成した場合、通常はAndroid3.x以上でしか動きません。ただし、ActionBarSherlockというライブラリを使うことでAndroid2.x以上(APIレベル5以上)で動かすことが可能になります。

ActionBarSherlockは以下のリンク

http://actionbarsherlock.com/

から圧縮ファイルがダウンロードできます。

ダウンロードしたらそれを解凍してプロジェクトにライブラリを追加します。ライブラリの作成と追加についてはライブラリの追加を見てください。

フラグメントを作る

では、タブ画面に表示したいフラグメントを作成します。

まずfragment1.xmlなどのファイルを作り、フラグメントのレイアウトを設定します。例えば以下のようなレイアウトです。

fragment1.xml
<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:columnCount="1" 
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_alignParentTop="true" 
        android:text="@string/fragment1_str" 
        android:textColor="#000000" 
        android:textSize="30sp" /> 

</RelativeLayout>

Relativeレイアウトにテキストビューを加えただけの構造になっています。

次にフラグメントを定義したjavaファイル(例えばFragment1.java)を作り、以下のような内容を書きます。

Fragment1.java
package com.MyApp.myapp;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;

public class Fragment1 extends Fragment
{
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                        Bundle savedInstanceState) 
    {
        return inflater.inflate(R.layout.fragment1, container, false);
    }
}

Android2.x以上に対応させるためにandroid.support.v4.appクラスのFragmentクラスを使っています。

アクティビティの設定

次にアクティビティの設定をします。

まず、レイアウト画面のxmlファイル(activity_main.xmlなど)で最も上にあるレイアウト要素に次のようにIDを設定します。

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container" >

</RelativeLayout>

このファイルではアクティビティのレイアウトのIDを"container"としています。

そして、最後にメインアクティビティ本体の定義をします。

MainActivity.java
package com.MyApp.myapp;

import android.os.Bundle;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

import com.actionbarsherlock.app.ActionBar;   
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity; 

public class MainActivity extends SherlockFragmentActivity 
{

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setTheme(R.style.Theme_Sherlock);
            //アプリ画面の種類を設定
        setContentView(R.layout.activity_main);
        
        ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        
        //タブの作成とタブリスナーの設定
        actionBar.addTab(actionBar.newTab()
            .setText("tab1")
            .setTabListener(
                new MainTabListener<Fragment1>(this, "tag1", Fragment1.class)
            )
        );
        actionBar.addTab(actionBar.newTab()
            .setText("tab2")
            .setTabListener(
                new MainTabListener<Fragment2>(this, "tag2", Fragment2.class)
            )
        );
    }

    //独自のタブリスナーの定義。
    public class MainTabListener<T extends Fragment> 
                                implements ActionBar.TabListener
    {
        private Fragment fragment;
            //タブリスナーで追加するフラグメント
        private final SherlockFragmentActivity activity;
        private final String tag;
        private final Class<T> cls;
            //Fragmentクラス型のClassインスタンス
        
        //タブリスナーの定義
        public MainTabListener(SherlockFragmentActivity activity, String tag, Class<T> cls)
        {
            this.activity = activity;
            this.tag = tag;
            this.cls = cls;
            fragment = activity.getSupportFragmentManager().findFragmentByTag(tag);
        }
        
        //タブが2度押しされたら呼ばれる。
        public void onTabReselected(Tab tab, FragmentTransaction ft){}
        
        //タブがクリックされたときに呼ばれる。
        public void onTabSelected(Tab tab, FragmentTransaction ft)
        {
            if(fragment == null){
                //フラグメントがnullなら新たに画面にフラグメントを設定する。
                fragment = Fragment.instantiate(activity, cls.getName());
                FragmentManager fm = activity.getSupportFragmentManager();
                fm.beginTransaction().add(R.id.container, fragment, tag).commit();
            }else{
                if(fragment.isDetached()){
                    FragmentManager fm = activity.getSupportFragmentManager();
                    fm.beginTransaction().attach(fragment).commit();
                }
            }
        }
        
        //タブが選択が解除されたときに呼ばれる。
        public void onTabUnselected(Tab tab, FragmentTransaction ft)
        {
            if(fragment != null){
                //解除されたフラグメントをアクティビティから引き離す。
                FragmentManager fm = activity.getSupportFragmentManager();
                fm.beginTransaction().detach(fragment).commit();
            }
        }
    }

}

タブを作る方法はタブ画面の作成(Android3.x以上)でタブを作るときの方法とほとんど変わりません。

onCreate関数内でアクションバーに2つのフラグメントを追加し、タブにタブリスナーを追加してタブイベントを受け取れるようにしています。

このようすればAndroid2.x以上でもActionBarを使うことができます。

関連項目
プライバシーポリシー