출처 :  http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110116958816 


Horizontal View Swiping with ViewPager

[이 포스트는  Rich “geekyouup” Hyndman 에 의해 작성되었습니다. 인생을 조금 쉽게 만들기 위하여 노력하는 사람이지요.  — Tim Bray]



 여러분이 이제 막 안드로이드 어플리케이션 개발을 시작한 개발자이건, 능숙한 베테랑이건 상관 없이, 수평으로 스크롤 되는 View 를 만들 경우가 있습니다. 이미 많은 안드로이드 어플리케이션들이 이 기능을 활용하고 있습니다. 예를 들어 새로운 안드로이드 마켓 어플리케이션이나, 구글 닥스, 구글+ 등이 그렇지요. ViewPager 는 이런 기능을 구현하기 위한 표준 방법입니다.



 ViewPager 는 'Compatibility Package Revison 3' 라이브러리에 포함되었으며, 안드로이드 1.6 이 후 버전에서 정상적으로 동작합니다. 우선 이 링크에 나온대로 라이브러리를 설치 하세요. 그 이 후에, 여러분의 안드로이드 프로젝트에서 우클릭을 하신 후, 'Android Tools' 메뉴를 선택하고, 'Add Compatibility' 항목을 선택하시기 바랍니다. 이 후에는 이제 새로운 기능을 활용하실 수 있습니다. (주> 몇 가지 주의사항이 있습니다. 우선, Add Compatibility 항목은 최신 ADT(version 12) 를 사용하지 않으면 나타나지 않는 거 같습니다. 그리고, Compatibility Package 라이브러리 설치가 완료된 후에는, 위의 링크에 나온 것처럼 개별 프로젝트에 라이브러리 추가 메뉴를 통해, 설치된 android-support-v4.jar 파일을 명시적으로 추가하셔야 합니다.)



 ViewPager 는 ViewGroup 의 일종으로, Gallery 나 ListView 같은 AdapterView 와 유사한 형식으로 동작합니다. 따라서 쉽게 사용하실 수 있을 겁니다. 단, 안드로이드 라이브러리에 기본적으로 존재하는 View 는 아니기 때문에, ViewPager 를 xml 레이아웃 상에서 사용하실 때는, 클래스 풀네임을 정확히 적으셔야합니다. 아래와 같이 말이지요.

 <android.support.v4.view.ViewPager
       
android:layout_width="match_parent"
       
android:layout_height="match_parent"
        …
/>

 ViewPagers 가 표시하는 View 는 PagerAdapter 를 통해 공급받습니다. PageAdapter 를 통해 개발자는 화면에 표시될 View 의 라이프사이클을 관리 할 수 있습니다. 일반적인 ListView 와 ListAdapter 의 관계와 동일하다고 이해하시면 됩니다. 한가지, PageAdapter 구현 클래스로 FragmentPagerAdapter 가 제공되는데, 이를 이용하면 여러분은 ViewPager 에서 Fragment 를 활용할 수 있습니다. 사용법은 getCount() 나 getItem() 을 구현하는 것 만큼이나 간단하지만 강력합니다. 이에 관한 샘플 코드가 Support Demos 항목에 이미 제공되고 있습니다. 그 중에서 관련된 부분을 조금 발쵀해 봤습니다.

    public static class MyAdapter extends FragmentPagerAdapter {
       
public MyAdapter(FragmentManager fm) {
           
super(fm);
       
}

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

       
@Override
       
public Fragment getItem(int position) {
           
return ArrayListFragment.newInstance(position);
       
}
   
}

 Fragment 를 처리하는 PagerAdapter 는 기본적으로 두 종류가 제공됩니다. 기본적으로 FragmentPagerAdapter 의 경우, 사용자가 어플리케이션 화면을 스윕해서 새로운 View 가 표시되면, 이전 Fragment 를 분리한 후, 메모리 상에 저장해 둡니다. 만일 사용자가 어플리케이션 화면을 반대로 스윕하면, 메모리 상에 보전된 Fragment 를 재활용하지요. 따라서, 여러분이 많은 수의 Fragment 를 지원할 필요가 있는 경우에는 FragmentStatePagerAdapter 를 고려할 필요가 있습니다. 이 경우, 개별 Fragment 는 화면에서 사라질 때 메모리 상에서 제거되며, 사용자가 화면을 반대로 스윕했을 떄, 기존에 저장된 상태 값을 기반으로 새롭게 재생성됩니다. 따라서, 만일 수는 적지만, 복잡한 구조의 Fragment 를 사용하는 경우에는 FragmentPagerAdpater 를, 많은 수의 Fragment 를 사용하는 경우에는 FragmentStatePagerAdapter 를 선택하시는 편이 좋습니다.


 또 한가지. 여러분의 이해를 돕기위하여 TextView 로 동작하는 ViewPager/PagerAdapter 예제 코드를 작성했습니다. 해당 예제를 기반으로 원하는 PagerAdapter 를 구현 하는 것은 여러분의 몫입니다. PageAdapter 의 instantiateItem() / destroyItem() 메서드를 통해 ViewPager 가 전달 됨으로, 해당 ViewPager 에 원하는 View 를 추가하거나 삭제할 수 있습니다.

    @Override
   
public Object instantiateItem(View collection, int position) {
       
View v = layoutInflater.inflate(...);
       
...
       
((ViewPager) collection).addView(v,0);
       
return tv;
   
}

   
@Override
   
public void destroyItem(View collection, int position, Object view) {
       
((ViewPager) collection).removeView((TextView) view);
   
}

 ViewPager 의 소스 코드는 <android-sdk>/extras/android/compatibility/v4/src. 에 포함되어 있습니다. 소스 코드와 Java Doc 문서를 잘 참고하시면, 여러가지 유용한 메서드들을 발견하실 수 있을 것 입니다. 예를 들어, setOnPageChangeListener() 같은 메서드는 현재 어플리케이션에서 어떤 View 가 화면 상에 표시되고 있는지 추적할 수 있게 해 줍니다.


 만일 여러분이 안드로이드 마켓에 ViewPager 를 이용한 어플리케이션을 출시하신다면, 구글+나 트위터를 통해 저에게 알려주세요. 저는 이 ViewPager 가 얼마나 널리 사용될 지, 그리고 어떤 멋진 시나리오를 가져올 지 기대하고 있답니다.

'Android > Tip&Tech' 카테고리의 다른 글

Android/Intent 사용 예  (2) 2012.03.20
[펌]svn 구축  (0) 2012.02.23
ProgressBar 이미지 커스터마이징하기  (0) 2012.02.08
액티비티와 태스크  (0) 2012.02.01
안드로이드 최신버전 확인하기  (0) 2012.01.30

+ Recent posts