9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Design Support LibraryのTabLayout

Posted at

目的

以前 SlidingTabsBasicをプロジェクトに導入する というのを書いたが、 Android Design Support Libraryの TabLayoutのおかげでタブの UIをもっと簡単に書けるようになった、というお話。

構成

登場するクラスとその構成は以下のとおり

  • TabLayout ... タブを表示する部分
  • ViewPager ... コンテンツの表示部分。左右スライドでページを切り替えられる。
  • MyViewPagerAdapter ... ViewPagerに実際のViewを与えるところ。

レイアウト

MainActivityのレイアウト。TabLayoutとViewPagerを配置する。

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
</LinearLayout>

MyViewPagerAdapter

Viewの提供とデータの関連付けを行うアダプタ。この辺は ListViewのアダプタとよく似ている。注意するのは instantiateItem, destroyItemでそれぞれ addView, removeViewするところ。

getCount, isViewFromObject, instantiateItem, destroyItemを最低限実装する。

MyPagerAdapter.java
public class MyPagerAdapter extends PagerAdapter {
    private LayoutInflater mLayoutInflater;

    public MyPagerAdapter(Activity activity) {
        mLayoutInflater = activity.getLayoutInflater();
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return "Item" + (position + 1);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return (view == object); // objectに viewが含まれるなら trueを返す
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View v = mLayoutInflater.inflate(R.layout.page, null);
        TextView tv = (TextView) v.findViewById(R.id.textView);
        tv.setText("Page" + (position + 1));

        container.addView(v);
        return v;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}

関連付け

MainActivityでは、 TabLayoutと ViewPager, MyPagerAdapterの関連付けを行う。

tabLayout.setupWithViewPagerと viewPager.setAdapterの順番に注意。 逆にすると " java.lang.IllegalArgumentException: ViewPager does not have a PagerAdapter set"で落ちる。

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

        MyPagerAdapter adapter = new MyPagerAdapter(this);

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);

        tabLayout.setupWithViewPager(viewPager);
        viewPager.setAdapter(adapter);
    }

done

標準的な動作ならこれだけ。

オプションを何も指定しないと、タブが増えると見出しが読めなくなるほど小さくなってしまう。TabLayoutのオプションに app:tabMode="scrollable"を付けることでタブを横スクロールすることができるようになる。

TabLayoutで設定可能なオプションは以下が詳しい。
TabLayoutで設定できるattributes一覧

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?