ToolBarで1行表示のタブを実現する方法


~~最近ではActionBarActivityが非推奨になりAppCompatActivityへと変化が起きてますが
同じく、ActionBarからの置き換えでToolBarが登場しました。~~
(なんか誤解を招きそうな書き方だったので修正。)


最近はActionBarからToolBarに置き換えられ、そして、ActionBarが廃止された事でActionBarActivityがAppCompatActivityへと置き換えられているみたいですが、ToolBarでなんとか1行表示のタブを実装する事が出来たのでメモ書きしておきたいと思います。

('ω').oO(細かい変更があるたびにクソ面倒臭いけど楽しいな？)

#完成例
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/55941/bfe1749e-224b-ad5e-fab0-4cb0e89ac57e.png "スクリーンショット 2015-06-21 17.49.41.png")
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/55941/9e084e5a-8678-4a54-6c2a-414dbe2d6197.png "スクリーンショット 2015-06-21 17.49.30.png")

#はじめに
この例では次のライブラリを使用しています。
[PagerSlidingTabStrip](https://github.com/jpardogo/PagerSlidingTabStrip)
まずはいつものアレをします。

```build.gradle
compile 'com.jpardogo.materialtabstrip:library:1.1.0'

```

#value/styles.xml
適当な色を定義しておきます。

```styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimaryDark">@color/md_indigo_700</item>
        <item name="colorPrimary">@color/md_indigo_500</item>
        <item name="colorAccent">@color/md_green_A700</item>

    </style>

</resources>

```


#MainActivity
##レイアウト
MainActivityで使用するViewは次の3つです。

1. android.support.v7.widget.Toolbar
2. com.astuetz.PagerSlidingTabStrip
3. android.support.v4.view.ViewPager

ToolBarの中にPagerSlidingTabStripを入れ込んで、ToolBarの下にViewPagerを配置する感じです。
実際には次のような感じになります。

```activity_main.xml

	<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity">

	    <android.support.v7.widget.Toolbar
    	    android:background="?attr/colorPrimary"
    	    android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:id="@+id/toolbar"
	        android:layout_alignParentTop="true"
	        android:layout_alignParentStart="true" >

	        <com.astuetz.PagerSlidingTabStrip
	            android:id="@+id/tabs"
	            android:layout_width="wrap_content"
	            android:layout_height="56dp"
	            android:layout_alignParentRight="true"
	            android:layout_marginLeft="70dp"
	            android:background="?attr/colorPrimary"
	            app:pstsDividerColor="#02a6d8"
	            app:pstsIndicatorColor="#fff"
	            app:pstsIndicatorHeight="2dp"
	            app:pstsShouldExpand="false"
	            app:pstsUnderlineHeight="0dp"/>
	    </android.support.v7.widget.Toolbar>

	    <android.support.v4.view.ViewPager
    	    android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
    	    android:id="@+id/pager"
	        android:layout_below="@+id/toolbar"
    	    android:layout_alignStart="@+id/toolbar" />

	</RelativeLayout>
```

##ソースコード
説明が面倒臭くなったので後はソースやら適当に貼り付けときます。

```MainActivity.java
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.astuetz.PagerSlidingTabStrip;

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private ViewPager viewPager;
    private PagerSlidingTabStrip pagerSlidingTabStrip;
    private TabPagerAdapter pagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        //toolbar.setLogo(R.mipmap.ic_launcher);
        toolbar.setTitle("TabTest");
        toolbar.inflateMenu(R.menu.menu_main);

        viewPager = (ViewPager) findViewById(R.id.pager);
        pagerAdapter = new TabPagerAdapter(this, getSupportFragmentManager());
        pagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
        viewPager.setAdapter(pagerAdapter);
        pagerSlidingTabStrip.setViewPager(viewPager);

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public static class TabPagerAdapter extends FragmentPagerAdapter implements PagerSlidingTabStrip.CustomTabProvider {

        private final int[] ICONS = {R.mipmap.ic_launcher, R.mipmap.ic_launcher};
        Context mContext;
        private Fragment f = null;

        public TabPagerAdapter(Context ctx, FragmentManager fm) {
            super(fm);
            mContext = ctx;
        }

        @Override
        public int getCount() {
            return ICONS.length;
        }

        @Override
        public android.support.v4.app.Fragment getItem(int position) {
            switch (position) {
                case 0:
                    f = FragmentPageOne.newInstance();
                    break;
                case 1:
                    f = FragmentPageOne.newInstance();
                    break;
            }
            return f;
        }

        @Override
        public View getCustomTabView(ViewGroup parent, int position) {
            LinearLayout customLayout = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.custom_tab, parent, false);
            ImageView imageView = (ImageView) customLayout.findViewById(R.id.image);
            imageView.setImageResource(ICONS[position]);
            return customLayout;
        }

        @Override
        public void tabSelected(View view) {

        }

        @Override
        public void tabUnselected(View view) {

        }
    }
}

```


#カスタムタブ
##レイアウト
タブに画像を貼り付けるため独自のレイアウトを作成しておきます。

```custom_tab.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="30dp"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/image"
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:paddingBottom="8dp"
        android:paddingTop="8dp"/>
</LinearLayout>
```

#Fragment
##レイアウト
```test_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Yo!"
        android:id="@+id/textView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>
```
##ソースコード
```FragmentPageOne.java
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentPageOne extends Fragment {

    View view;

    public static Fragment newInstance(){
        return new FragmentPageOne();
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.test_fragment, container, false);

        return view;
    }
}

```