ViewPagerコントロールを用いてフリックによるページ切り替えを実装します。
プロジェクト
Android アプリケーションプロジェクトを作成します。
[New Android Application]ダイアログボックスが表示されますので、以下を設定します。
- Application Name: "SimpleSurfaceViewXML"
- Project Name: "SimpleSurfaceViewXML"
- Package Name: "com.iPentec.simplesurfaceviewxml"
- Minimum Required SDK: "API 8: Android 2.2 (Froyo)"
- Target SDK: "API 17: Android 4.2 (Jelly Bean)"
- Compile With: "API 17: Android 4.2 (Jelly Bean)"
- Theme: "Holo Light with Dark Action Bar"
UIの作成
以下のレイアウトを作成します。
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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</RelativeLayout>
PagerViewで用いるレイアウトファイルの追加
ViewPagerで表示するレイアウトページを作成します。
レイアウトを追加します。Eclipseの[New]メニューの[Other]メニューを選択します。
[New]ダイアログボックスが表示されます。
"Android"カテゴリから"Android XML Layout File"を選択します。[Next]ボタンを押します。
[New Android Layout XML File]ダイアログボックスが表示されます。
一覧から"LinerLayout"を選択します。[File]にXMLファイル名を入力します。今回は"pager_page.xml"としました。[Next]ボタンを押します。
pager_page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Page1"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
コード
以下のコードを記述します。
MainActivity.java
package com.iPentec.viewpagerdemo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.support.v4.view.ViewPager;
public class MainActivity extends Activity {
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mViewPager = (ViewPager)this.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(new CustomPagerAdapter(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
解説
onCreateの下記の2行が追記部分です。
this.mViewPager = (ViewPager)this.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(new CustomPagerAdapter(this));
リソースIDを指定しViewPagerコントロールオブジェクトを取得します。ViewPagerのsetAdapter()メソッドを呼び出しカスタム化したPagerAdapterオブジェクト(今回の例ではCustomPagerAdapterのインスタンス)を与えます。
CustomPagerAdapter.java
package com.iPentec.viewpagerdemo;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
public class CustomPagerAdapter extends PagerAdapter {
public final static int N = 5;
private LayoutInflater _inflater = null;
public CustomPagerAdapter(Context c) {
super();
_inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
LinearLayout layout = (LinearLayout) _inflater.inflate(R.layout.pager_page, null);
int brt = 255*position/N;
layout.setBackgroundColor(Color.rgb(brt,brt,brt));
TextView textview1 = (TextView)layout.findViewById(R.id.textView1);
textview1.setTextColor(Color.rgb(255-brt, 255-brt, 255-brt));
textview1.setText("Page"+String.valueOf(position+1));
container.addView(layout);
return layout;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
@Override
public int getCount() {
return N;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
}
解説
ViewPagerコントロールに設定するカスタム化されたPagerAdapterクラスです。PagerAdapterの派生クラスであるため、コンストラクタ、instantiateItem(), destroyItem(), getCount(), isViewFromObject()メソッドをオバーライドします。
コンストラクタ
_inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
により、LayoutInflaterを取得します。
instantiateItem
各ページのレイアウトを設定します。
LinearLayout layout = (LinearLayout) _inflater.inflate(R.layout.pager_page, null);
LayoutInflatorオブジェクトのinflate()メソッドを呼び出しレイアウトを設定します。レイアウトファイルのリソースID"R.layout.pager_page"をinflateメソッドの第一引数に与えます。
int brt = 255*position/N;
layout.setBackgroundColor(Color.rgb(brt,brt,brt));
表示されるページごとに異なった背景色を設定します。
TextView textview1 = (TextView)layout.findViewById(R.id.textView1);
textview1.setTextColor(Color.rgb(255-brt, 255-brt, 255-brt));
textview1.setText("Page"+String.valueOf(position+1));
表示されるページのTextViewに"Page(ページ番号)"の文字列を表示します。また、TextViewの文字色をページの背景色の反対色に設定します。
container.addView(layout);
return layout;
レイアウトを設定します。
destroyItem
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
removeView()メソッドを呼び出しViewを取り除く処理を記述します。
getCount
PagerViewのページ数を返します。今回は5ページとするので5を常に返します。
isViewFromObject
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
上記を記述します。
実行結果
プロジェクトを実行します。下図の画面が表示されます。
画面をフリックするとページが切り替わります。ページの背景色と左上に表示されるTextViewに表示される文字列が変わることが確認できます。
著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-04
作成日: 2013-04-17