kojiko-android’s blog

開発中にハマった時の解決策や、忘れがちなことを残しておきます。

スワイプで切り替わるビュー ViewPager/Fragment

Android studioで、スワイプで切り替わるビューを動的に作成する方法

 レイアウトで定義したフラグメントをビューページャーにセットし、横方向スワイプで移動できるようにします。
また、UIの上部にPagerTabStripを配置し、現在のページのタイトルを表示する方法です。
親アクティビティから、子フラグメントのメソッドを呼び出す方法も載せています。

レイアウトに、ビューページャーを配置します。その中にタブストリップを配置します。
<android.support.v4.view.ViewPager
    class="android.support.v4.view.ViewPager"
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <android.support.v4.view.PagerTabStrip
        class="android.support.v4.view.PagerTabStrip"
        android:id="@+id/view2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</android.support.v4.view.ViewPager>
ページャーに表示するフラグメントのレイアウトxmlを何個か用意する

フラグメント0、1、2の3つを用意しました。

public class Fragment0 extends Fragment{

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_fragment0,null);
        return v;
    }
フラグメントページアダプターを継承したクラスを作る
public class fragmentPagerAdapter extends FragmentPagerAdapter {
    public fragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new Fragment0();
            case 1:
                return new Fragment1();
            default:
                return new Fragment2();
        }
    }

    //フラグメントの数。
    @Override
    public int getCount() {
        return 3;
    }

    //上部のタブに表示するタイトル。
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "フラグメント0";
            case 1:
                return "フラグメント1";
            default:
                return "フラグメント2";
        }
    }

  //任意ですが、アクティビティ側からフラグメントの参照を得るためのメソッドです。
    public Fragment findFragmentByPosition(ViewPager viewPager, int position) {
        return (Fragment) instantiateItem(viewPager, position);
    }
}
アクティビティ側のonCreate等
  fragmentPagerAdapter adapter;
  ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
  adapter = new fragmentPagerAdapter(getSupportFragmentManager());
  pager.setAdapter(adapter);
アクティビティから、フラグメントの参照を得る。

 アクティビティ側から、フラグメントのパブリックなメソッドを実行したい場合などです。
動的に生成したフラグメントの場合です。

ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager);
fragmentPagerAdapter adapter = (fragmentPagerAdapter)viewPager.getAdapter();
Fragment0 fragment0 = (Fragment0)adapter.findFragmentByPosition(viewPager,0);  //何番目のフラグメントか
fragment0.パブリックなメソッド();
フラグメントから、自身を含んでいる親のアクティビティの参照を得る
getActivity()


 フラグメントのビューは、画面の両隣よりも外側に移動すると(つまり右に2回スワイプすると最初に見えていたものは)消えてしまうようなので、
ビューの状態を維持したい場合は、フラグメントのonCreateなどで初期化・復元の処理が必要です。

 参考:フラグメント→アクティビティの通信
フラグメントで起きたイベントをアクティビティに知らせる(コールバック) - kojiko-android’s blog