안드로이드 With Java #24 Pager / TabLayout
TabLayout
이란 위의 설명 이미지와 같이 선택된 탭에 따라 각각 다른 페이지를 보여주는 것이다.
선택된 Tab
에 따라 화면을 내보내주는 역할을 ViewPager
에서 담당한다.
각 Page
는 결국 Fragment
고, Pager
는 Fragment
를 해당 인덱스에 맞게 돌려주는 역할을 한다.
ViewPager
와 TabLayout
도 이전에 RecyclerView
를 사용했을 때처럼 라이브러리를 따로 추가해주어야 한다.
app
수준의 build.gradle
로 들어가서 dependencies
를 추가해주자.
이전에는 implementation "com.android.support:design:$libraryVersion"
와 같이
"com.android.support..."
을 추가해줬는데 이제는 구글에서 공식적으로 android.support
는 더이상 릴리즈하지 않을 것이라고 발표했다.
한마디로 레거시가 된 것이다.
그래서 이제는 implementation 'com.google.android.material:material:1.0.0'
와 같이 material
이 그 역할을 대신한다.
위와 같이 추가해주고 Sync Now
를 클릭하자.
위와 같이 TabLayout
영역과 ViewPager
영역을 생성해준다.
ListView
에서처럼 Adapter
를 작성하는데 PagerView
에서는 PagerAdater
를 사용한다.
필수 메소드들은 Alt+Enter
키로 전부 auto import
가능하다.
생성자에서는 tabCount
멤버변수를 만들고 tabCount
를 받아서 넣어주는 것까지 해준다.
getItem()
메소드는 position
에 맞게 해당 Fragment
를 반환해주는 것인데, 우리는 현재 만들어놓은 Fragment
가 없으므로 비워준다.
getCount()
메소드는 전체 페이지 수를 반환하는 건데, tabCount
를 리턴해주면 된다.
이렇게 FragmentOne
, FragmentTwo
, FragmentThree
에 대한 클래스를 작성해준다.
그리고 extends
키워드를 이용해 Fragment
클래스를 상속한다.
기존에 Fragment
클래스를 상속하고 아무것도 안하는 Fragment
클래스에 View
를 반환하는 로직을 추가한다.
View
는 만들어뒀던 Fragment
레이아웃을 이용해 inflate()
메소드를 통해 만든다.
inflater.inflate(R.layout.Fragment..., container, false)
inflate()
시에 onCreateView
는 파라미터로 container
가 있음에 유의하자.
기존에 Fragment
가 없어서 작성하지 못했던 getItem()
메소드를 다시 작성해준다.
바뀐 position의 번호가 들어올 때마다 해당하는 Fragment
의 클래스를 반환하게 해주면 된다.
tabLayout
은 말 그대로 tab
의 Layout
부분만 담당하는 것이다. 그러므로 우리가 만든 3개의 Fragment
를 표기할 때 눌러줄 tab
UI가 3개 올 수 있도록 설정해주어야 한다.
viewPager
는 말 그대로 pager
를 표기해주는 view
이다. pager
는 tab
을 넘기면 새로운 page
를 표기하는 기능을 지닌 것이고 view
는 그것을 보여주는 것이다. 여기에 page
를 넘기는 로직은 PagerAdapter
에 작성해두었으니 viewPager
에는 그 PagerAdapter
만 세팅해주면 된다.
스와이프하면 페이지가 잘 넘어가는데, tabLayout
과 viewPager
가 연동이 안 되어있다.
이전에 tabLayout
에 있는 ONE
, TWO
, THREE
를 눌러도 반응이 없었다. 이걸 해결해주기 위해서는 addOnTabSelectedListener()
메소드를 통해 onTabSelectedListener(){}
를 등록하여 tabLayout
에 있는 item
이 선택되었을 때, viewPager
가 page
를 바꾸도록 명령해야 한다.
위와 같이 작성하면, onTabSelected()
메소드가 탭이 선택됐을 때, 작동하고 viewPager
에서 tab
이 가지고 있는 position
에 따라 page
를 바꾸게 된다.
이젠 Tab
에서 ONE
, TWO
, THREE
등을 누르면 반응한다.
하지만 스와이프 시에 Tab
에서 선택된 항목이 자동으로 바뀌지 않는다.
위와 같이 viewPager.addOnPageChangeListener()
에 TabLayout.TabLayoutOnPageChangeListener(tabLayout)
을 넣어 작성해주면 잘 연동된다.
잘 연동되었다.