sitelink1 https://huewu.blog.me/110116958816 
sitelink2  
sitelink3  

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 가 얼마나 널리 사용될 지, 그리고 어떤 멋진 시나리오를 가져올 지 기대하고 있답니다.

 

 

샘플 코드(Activity 와 Layout) -> AwesomePagerActivity.java  main.xml

 

 

번호 제목 글쓴이 날짜 조회 수
68 TTS 를 위한 스마트폰 설정 및 TTS 샘플 file 황제낙엽 2019.02.16 460
67 Creating swipe views with tabs file 황제낙엽 2019.02.10 102
» [번역] 안드로이드 ViewPager 를 이용한 수평 화면 전환 file 황제낙엽 2019.02.09 71
65 동적 레이아웃 생성과 자동 줄바꿈 구현 file 황제낙엽 2018.12.26 311
64 qemu-system-~.exe 의 작동이 중지되었습니다 file 황제낙엽 2018.11.27 55
63 Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'. file 황제낙엽 2018.11.27 59
62 Error:Minimum supported Gradle version is 4.1. 황제낙엽 2018.11.27 84
61 No toolchains found in the NDK toolchains folder for ABI 황제낙엽 2018.11.27 33
60 [성공샘플] HttpURLConnection 을 이용하여 JSON 데이터 보내기 예제 황제낙엽 2018.11.10 649
59 [Android] 네이버 음성합성(TTS) API 사용해 보기 file 황제낙엽 2018.11.01 167
58 [Android] TTS (Text To Speech) API 샘플 코드 file 황제낙엽 2018.11.01 128
57 Google Cloud API 설정법 file 황제낙엽 2018.11.01 39
56 AsyncTask 사용하기 황제낙엽 2018.10.29 36
55 Volley 소개 및 관련 링크 황제낙엽 2018.10.29 63
54 AsyncTask 를 이용한 HttpURLConnection 사용법 [1] 황제낙엽 2018.10.20 33
53 HttpURLConnection 을 이용하여 JSON 데이터 보내기 예제 [1] file 황제낙엽 2018.10.20 102
52 STT 학습 링크 모음 (sample link) 황제낙엽 2018.10.11 552
51 코틀린(Kotlin) 학습용 링크 모음 황제낙엽 2018.10.11 64
50 저장소 파일 불러올 때 권한 요청 설정 file 황제낙엽 2018.08.21 55
49 안드로이드 파일시스템에 파일 생성하여 데이터 저장, 불러오기 예제 황제낙엽 2018.08.21 58