ActionBar Tab - ViewPager

# ActionBar Tab

<p>ActionのTabを勉強したので覚え書き。</p>

## Layoutを定義

<p>LayoutにViewPagerを定義する。</p>

```java:layout.xml
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />
```

## ActionBarの設定

<p>ActionBarのナビゲーションモードをタブに設定する。</p>

```java:MainActivity.java
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
```

## Tabの作成とActionBar.TabListenerの実装

<p>ActionBarにTabを作成し、Tabにコールバックを登録する。
コールバック内でTabが選択された場合にViewPagerで表示する内容を変更する。</p>

```java:MainActivity.java
public class MainActivity implements ActionBar.TabListener {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // ViewPagerを取得する        
        mViewPager = (ViewPager) findViewById(R.id.pager);
        // タブを作成し、リスナー登録をする        
        getSupportActionBar().addTab(getSupportActionBar().newTab().setText("First").setTabListener(this);
        getSupportActionBar().addTab(getSupportActionBar().newTab().setText("Second").setTabListener(this);
        ...
    }
    @Override
    public void onTabSelected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        // タブ選択で表示しているページを切り替え
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        // Do nothing
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        // Do nothing
    }
    ...
}
```

## FragmentPagerAdapterを実装

<p>FragmentPagerAdapterを拡張したクラスを作成し、ViewPagerにAdapterとして登録する。</p>

```java:MainActivity.java
public class MainActivity implements ActionBar.TabListener {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        // ViewPagerを取得する        
        mViewPager = (ViewPager) findViewById(R.id.pager);
        // Adapterを作成する
        mTabsAdapter = new TabsAdapter(this);
        // Adapterを設定する
        mViewPager.setAdapter(new TabsAdapter());
        ...
    }

    // FragmentPagerAdapterを拡張したクラス
    public static class TabsAdapter extends FragmentPagerAdapter

        public TabsAdapter(Activity activity) {
            super(activity.getFragmentManager());
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public Fragment getItem(int position) {
            return new Fragment();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
            case 0:
                return "First";
            case 1:
                return "Second";
            }
            return null;
        }
    }
```

## ViewPagerにOnPageChangeListenerを登録

<p>ページ切り替え時のイベント取得のためにOnPageChangeListenerを実装し、ViewPagerにコールバックとして登録する。<br>
また、コールバックの中でTabの選択位置を変更する。<br>
(ここではSimpleOnPageChangeListenerを拡張したクラスを登録。)</p>

```java:MainActivity.java
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        // Tabの選択位置を変更する
                        getSupportActionBar().setSelectedNavigationItem(position);
                    }
                });
```