最近ではActionBarActivityが非推奨になりAppCompatActivityへと変化が起きてますが
同じく、ActionBarからの置き換えでToolBarが登場しました。
(なんか誤解を招きそうな書き方だったので修正。)
最近はActionBarからToolBarに置き換えられ、そして、ActionBarが廃止された事でActionBarActivityがAppCompatActivityへと置き換えられているみたいですが、ToolBarでなんとか1行表示のタブを実装する事が出来たのでメモ書きしておきたいと思います。
('ω').oO(細かい変更があるたびにクソ面倒臭いけど楽しいな?)
#はじめに
この例では次のライブラリを使用しています。
PagerSlidingTabStrip
まずはいつものアレをします。
compile 'com.jpardogo.materialtabstrip:library:1.1.0'
#value/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つです。
- android.support.v7.widget.Toolbar
- com.astuetz.PagerSlidingTabStrip
- android.support.v4.view.ViewPager
ToolBarの中にPagerSlidingTabStripを入れ込んで、ToolBarの下にViewPagerを配置する感じです。
実際には次のような感じになります。
<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>
##ソースコード
説明が面倒臭くなったので後はソースやら適当に貼り付けときます。
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) {
}
}
}
#カスタムタブ
##レイアウト
タブに画像を貼り付けるため独自のレイアウトを作成しておきます。
<?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
##レイアウト
<?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>
##ソースコード
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;
}
}