의존성 추가
implementation 'com.google.android.material:material:1.1.0'
탭 레이아웃은 탭을 표시할 수 있는 수평 레이아웃을 제공하는 것이다.. 화면 전환을 위해 ViewPager와 함께 사용한다. 하지만 명칭대로 레이아웃은 또 아니다. 왜냐하면 레이아웃처럼 마음대로 버튼 등을 배치 할 수 있는게 아니라 그저 나열할 뿐인 Item들을 감싸고만 있는 컨테이너와 오히려 비슷하기 때문이다.
ViewPager2와 tablayout을 사용해서 슬라이드로 화면을 넘길 수 있는 화면을 구현했다.
한 화면에서 여러 뷰를 스와핑해서 전환하는 기능이 필요할 때 사용한다. 여기서 페이지란 여러 뷰가 될 수도 있고 프래그먼트가 될 수 도 있다. 나는 프래그먼트를 사용했다.
의존성 추가
implementation 'androidx.viewpager2:viewpager2:1.0.0'
ViewPager2는 표시할 새 페이지의 요소로 FragmentStateAdapter 객체를 사용한다
fragmentActivity: FragmentActivity: 이 생성자 매개변수는 프래그먼트가 속한 액티비티를 나타내다.
val count: Int: ViewPager2에 표시할 프래그먼트의 총 개수.
getItemCount(): ViewPager2에서 표시할 아이템(프래그먼트)의 총 개수를 반환하는 메서드. 이 메서드에서는 고정된 값을 반환하도록 되어 있다.
createFragment(position: Int): 해당 위치(position)에 대한 프래그먼트를 생성하는 메서드. 코드에서는 위치에 따라 다른 프래그먼트를 생성하도록 되어 있다.
총 개수가 2로 고정되어 있는데, 실제로는 count 매개변수를 활용하여 다양한 프래그먼트를 ViewPager2에 추가할 수 있다.
createFragment() 메서드도 해당 위치에 따라 다른 프래그먼트를 반환하도록 구현했다. 첫 번째 위치에는 FragmentTodo를, 두 번째 위치에는 FragmentBookMark를 반환하며, 이외의 위치에 대해서는 잘못된 위치 예외를 던진다.
원래 그냥 if문만 쓰고 끝내려 했는데 똑똑한 jetbrain이 허용을 해주지 않아서 예외처리 해버렸다..!
Tab은 ViewPager와 연결되어 사용되는 경우가 많기 때문에 ViewPager2와 TabLayout을 연결한다.
ViewPager와 Tab을 연결하기 위해서는 TabLayoutMediator 라는 클래스를 사용해야 함. 이 클래스가 Tab과 ViewPager를 하나처럼 연결시켜준다.
탭의 개수를 늘리고 싶으면 Adapter안에 메소드인 getItemCount 의 리턴수 탭 수에 맞게 조절, createFragment에서 탭 수에 맞게 Fragment추가, TabLayoutMediator에서 추가된 탭 이름 추가, Adapter객체 생성 시 생성자에 주는 개수를 증가시키면 된다.
getItemCount() : FragmentStateAdapter의 public method는 아니다. FragmentStateAdapter가 상속하는 Recyclerview.Adapter 클래스의 public method이다. 해당 Adapter가 가지고 있는 data set 안에서의 전체 아이템 수를 리턴하는 메소드이다.
createFragment() : FragmentStateAdapter의 public method이다. 특정 포지션에 연결된 새로운 Fragment를 제공하는 기능을 가지고 있는 메소드이다.
position : 어댑터에서 데이터 아이템이나 뷰를 가리키는 인덱스 값이다. 데이터 목록이나 페이지들이 표시되는 리스트나 슬라이드 형식의 컨테이너에서 각각의 아이템 또는 페이지가 위치한 위치를 나타낸다.