상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

Kotlin과 Android/Android

코틀린으로 안드로이드 뷰 페이저2(View Pager2) 한방에 끝내기

월터제이(Walter J) 2020. 11. 11. 09:00

안녕하세요, 반갑습니다!

 

오늘은 좌우로 손을 쓸어넘겨 화면을 전환하는,

꽤 멋드러진 뷰(View) 에 대해서 설명하려고 합니다.

 

 

뷰 페이저2(View Pager2)

 

 

1. .xml 파일에서 뷰 페이저2(View Pager2) 배치하기

메인이 되는 액티비티에 단순하게 뷰 페이저2(View Pager2) 하나만 배치했습니다.

<androidx.constraintlayout.widget.ConstraintLayout
    .
    .
    .>
    
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/vPager2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
        
</androidx.constraintlayout.widget.ConstraintLayout>

 

그래서..

 

걍 하얘요...

하지만! 뷰페이저(ViewPage2) 는 각 프래그먼트를 배치해서 화면을 교체하는 것이죠.

따라서 메인 액티비티는 전혀 상관이 없습니다.

 

2. 뷰페이저2(View Pager2) 에 들어갈 프래그먼트 만들기

각 화면, 즉 프래그먼트를 만들어야 합니다.

보여줘야할 만큼 만들면 되는데요.

저는 예시로 3개를 만들었습니다.

 

먼저, 프래그먼트 클래스를 만들어 줍니다.

그러면, 이렇게 프래그먼트 클래스와 연결되는 .xml 파일도 같이 생성됩니다.

이제 각 .xml 파일에 원하는 레이아웃을 만들어 주면 되는데요.

저는 아래와 같이 텍스트뷰(TextView) 와 아이유 사진을 보여줄 이미지 뷰(ImageView)를 배치했습니다.

아이유 이쁘쥬?ㅎㅎ

 

각 프래그먼트의 xml 코드입니다.

<LinearLayout
    .
    .
    .>

    <TextView
        android:id="@+id/f1TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="아이유 보라색 머리"
        android:textAppearance="@style/TextAppearance.AppCompat.Body2"
        android:textSize="35sp" />

    <ImageView
        android:id="@+id/f1img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp"
        android:scaleType="centerCrop"
        tools:src="@drawable/iu1" />
</LinearLayout>

 

2. 뷰페이저2(View Pager2)를 위한 어댑터(FragmentStateAdapter) 만들기

이제 뷰페이저2(View Pager2) 가 동작하기 위한 어댑터(FragmentStateAdapter) 를 만들어야 합니다.

그런데 기존과 달리 이제는 리싸이클러뷰(RecyclerView) 와 동일한 어댑터를 사용하게 됩니다.

 

이렇게 추적해 보면 RecyclerView.Adapter 를 상속하고 있음을 알 수 있습니다.

 

어쨌거나, 그래도 저희는 리싸이클러뷰(RecyclerView)를 만드는 건 아니니까요.

뷰페이저2(View Pager2)의 어댑터(Adapter)로 사용될 클래스를 만들어 주세요.

그리고 FragmentStateAdapter 를 상속해주세요.

 

그럼 아래와 같이 빨간 줄이 생기면,

자동 완성을 이용해서 Implement Method 를 만들어 주면 됩니다.

 

잘 만들어 졌나요?

그럼 각 메서드(Method) 를 작성해주세요.

class ExViewPagerAdapter(fa:FragmentActivity) : FragmentStateAdapter(fa) {
    var fragments = listOf<Fragment>()   //프래그먼트가 저장될 배열

    override fun getItemCount(): Int = fragments.size    //프래그먼트 배열의 크기
    override fun createFragment(position: Int): Fragment {
        return fragments.get(position)    //반환될 프래그먼트
    }
}

이제 뷰페이저2(View Pager2)가 동작할 액티비티에서 이 어댑터를 객체로 만들 것입니다.

 

3. 액티비티에서 어댑터(RecyclerAdapter) 연결하기

override fun onCreate(savedInstanceState: Bundle?) {
    .
    .
    .
    //뷰 페이저2 설정
    val fragmentList = listOf(Fragment1(), Fragment2(), Fragment3())
    val adapter = ExViewPagerAdapter(this)
    adapter.fragments = fragmentList
    vPager2.adapter = adapter    //뷰페이저2 에 어댑터 연결
}

 

어떤가요?

이렇게 보니 정말 리싸이클러뷰(RecyclerView) 의 어댑터를 만들때와 비슷하네요.

 

이렇게 뷰 페이저2(View Pager2) 에 어댑터까지 연결하면,

 

완성입니다!

이 뷰 페이저2(View Pager2) 를 이용해서 이제 더 앱다운 앱이 되는 것 같네요!

그리고 역시 아이유는 이쁘구요ㅎㅎ

 

 

 

그럼 다음 포스팅에서 뵙겠습니다.

감사합니다.

반응형