Table of Contents
複数のページを持つAndroidアプリで、左右のスワイプによるページ切り替えを行う方法です。
ラベル(TextView)をひとつだけ持つページを2つ作り、それをスワイプで切り替える簡単なサンプルアプリの作り方を通して ViewPager や FragmentPagerAdapter、各XMLレイアウトの書き方について紹介します。
アプリ全体のレイアウト
スワイプ可能なページはViewPager(android.support.v4.view.ViewPager)の子要素として追加していきます。
そのため、アプリ全体のレイアウトを以下のようにします。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" />
ページはプログラム側で追加するので、ViewPagerの中身は空で構いません。
各ページのレイアウト
一つひとつのページのレイアウトの雛形を指定するXMLファイルを作ります。
res/layout に fragment.xml というXMLレイアウトファイルを新しく作成し、中身を以下のように編集してください。
fragment.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="100dp" android:textSize="64dp" android:text="defaultText" /> </RelativeLayout>
画面にラベルが一つだけ表示されるレイアウトです。
後ほど defaultText の部分は、ページ番号に応じたテキストになるようにプログラムで書き換えられるようにします。
スワイプ動作のプログラム
2つのページ(Fragment)をスワイプで切り替える動作を行うためのプログラム(Kotlin)です。
package com.example.test.testproject import android.os.Bundle import android.support.v4.app.Fragment import android.support.v4.app.FragmentActivity import android.support.v4.app.FragmentPagerAdapter import android.support.v4.app.FragmentManager import android.support.v4.view.ViewPager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView const val LABEL_TEXT_KEY = "labelText" class MainActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // アプリ全体のページビュー val pager : ViewPager = this.findViewById(R.id.pager) // 下記のページアダプターを設定 val fragmentManager : FragmentManager = supportFragmentManager val adapter = MyPageAdapter(fragmentManager) pager.adapter = adapter } } // 各ページ(Fragment)をXMLレイアウトから作成 class MyFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View { val layout = inflater?.inflate(R.layout.fragment, container, false) // テキスト情報を取り出す val bundle : Bundle = arguments val labelText : String = bundle.get(LABEL_TEXT_KEY) as String // ラベルにテキストを設定 val textView : TextView = layout!!.findViewById(R.id.textView) textView.text = labelText return layout } } // ページ数やページの情報を設定するFragmentPagerAdapter class MyPageAdapter(fm : FragmentManager) : FragmentPagerAdapter(fm) { // 各ページの情報 override fun getItem(position: Int): Fragment { val fragment : MyFragment = MyFragment() // 各ページに渡すテキスト情報を設定 val bundle : Bundle = Bundle() bundle.putString(LABEL_TEXT_KEY, "Page" + position) fragment.arguments = bundle return fragment } // ページ数 override fun getCount(): Int { return 2 } }
全ページの管理を行うためのクラス MyPageAdapter と、各ページを作成するクラス MyFragment を追加しています。
MyPageAdapter
FragmentPagerAdapter を継承した MyPageAdapter は、以下2つのメソッドを必ずオーバーライドします。
- getItem(position: Int): Fragment
- getCount(): Int
getItem では、各ページの情報を設定します。引数 position にはページの番号(0から)が含まれます。
getCount は、ページ数を設定するメソッドです。今回の例では2ページとしたので 2 を返しています。
MyFragment
先ほど作成したXMLレイアウト(fragment.xml)を読み込んで各ページを作成する処理を行っています。
MyPageAdapter で設定したラベルテキストをここで読み込んで設定を行います。
サンプルアプリの実行結果
以上のファイルとプログラムからなるアプリを実行すると、まず以下の画面が現れます。
右にスワイプすると、次の画面がスムーズに現れます。
スワイプが終わると、次の画面に完全に切り替わります。
さらに右にスワイプしようとすると、最後のページなので画面右にスワイプできないことを表すインジケータが表示されます。
以上、ViewPagerとFragmentPagerAdapterでスワイプによるページの切り替えを行うアプリの例でした。