Android でページをスクロールするUIをつくる(ViewPager)
ViewPager を使って, スクロールして複数のViewを見るような
iOS ですと, ScrollView と, UIView のコンビネーションで作れたりするやつの紹介です。(Bloggerでも同じこと書きました)
android-support-v4.jar というjar に, ViewPager といった拡張クラスが入っています。これを使います。
ExtraPackに入っているものですので, 無ければSDK Managerを使ってインストールします。
さて, このViewPagerですが, スワイプ操作で, ページを移動していくような
使い方は,かなりListに似ています。Adapter(UIの構築などのコードつき), そのAdapterの操作でデータを管理, AdapterをViewPagerにセットすることでデータ表示させます。
さて今回作ったものはこんな感じです。(一部省略)
まだありますが, 省略しときます。これらを左右のスワイプで移動させます。
さてこれを作るための手順です。
1. 全体のレイアウト(xml)
2. 各ページのレイアウト(xml)
3. Main のActivity
4. Adapter
1. 全体のレイアウト
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" /> </LinearLayout>
2.各ページのレイアウト(xml)
ページに使うレイアウトを作りました。 card.xml という名前を付けました。画像とテキストが入っています。
ページのレイアウトを取り込みます。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView android:id="@+id/img"
android:contentDescription="@string/cardimg"
android:layout_width="fill_parent"
android:layout_marginTop="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
></ImageView>
<TextView android:id="@+id/word"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:textSize="30sp"
android:textAlignment="center"
android:gravity="center"
/>
</LinearLayout>
3. Main のActivity
本体Activity のコードです。
ポイントは, ViewPager を取り出して, Adapter と, PageChangeListener を設定しているところです。
次回はUI変更のためのイベントの管理について説明します。
public class ViewPagerActivity extends Activity
{
private ViewPager viewPager;
List<Persondata> list;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.viewport);
this.list = PersonDataGenerator.createPersonData();
viewPager = (ViewPager) findViewById(R.id.viewpager);
PagerAdapter pagerAdapter = new CardPagerAdapter(this, list);
viewPager.setOnPageChangeListener(new PageChangeListener());
viewPager.setAdapter(pagerAdapter);
}
class PageChangeListener extends SimpleOnPageChangeListener
{
@Override
public void onPageSelected(int position)
{
// Page change Operation!
}
}
}
4. Adapter
Adapter とは, 各ページのデータを設定したり, ページのリソースの処理をしたりするものです。ListView のAdapter とだいたい同じ 感じですが, PagerAdapter を extends する必要があります。
その実装例です。
@Override しているメソッドは必須です。 destroyItem は, Eclipse のQuickFix では登場しませんが, ないと, ページをめくった時に落ちますw。(Viewのメモリ管理をしているっぽい)
public class CardPagerAdapter extends PagerAdapter
{
LayoutInflater _inflater = null;
List<Persondata> list;
private TextView nameView;
private ImageView charView;
public CardPagerAdapter( Context context, List<Persondata> list )
{
super();
_inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.list = list;
}
@Override
public Object instantiateItem(ViewGroup container, int position)
{
LinearLayout layout = (LinearLayout)_inflater.inflate(R.layout.card, null);
nameView = (TextView)layout.findViewById(R.id.word);
nameView.setText(list.get(position).getName());
charView = (ImageView)layout.findViewById(R.id.img);
charView.setImageResource(list.get(position).getRes());
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 list.size();
}
@Override
public boolean isViewFromObject(View view, Object obj)
{
return view.equals(obj);
}
}
各ページのデータを外から注入して, 画像とテキストを設定します。
レイアウトは, XML から読み込んでいます(card.xml)
public class PersonData
{
private String name;
private int res;
public PersonData( String name, int res )
{
this.name = name;
this.res = res;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getRes()
{
return res;
}
public void setRes(int res)
{
this.res = res;
}
}
public class PersonDataGenerator
{
public static List<Persondata> createPersonData()
{
List<Persondata> res = new ArrayList<Persondata>();
res.add(new PersonData("Sara Rukawa", R.drawable.tw_sar_eco));
res.add(new PersonData("Aoi Hinomoto", R.drawable.tw_aoi_eco));
res.add(new PersonData("Himeno Katsuragi", R.drawable.tw_him_eco));
res.add(new PersonData("Sharuru Yoshino", R.drawable.tw_shr_eco));
res.add(new PersonData("Rikka Morizono", R.drawable.tw_rik_eco));
return res;
}
}
画像のリソースと名前を定義しているだけですけどね。
これで, ページをスクロールして表示していくようなUIの出来上がりです。標準のライブラリだけできるのは, 素敵です。
さて, 見た目はこれでよいわけですが, こっからが難関です。各ページでイベントを拾います。では次回



