taplayout, ViewPager2

남궁현·2023년 8월 10일
0

Android

목록 보기
7/15

선발대 과제 시작

  • tablayout, viewPager2, toolbar, recyclerView를 사용해서 ui 를 구성하는 1차 과제를 시작했다. 혼자 공부하며 몇가지 앱을 만들어보긴 했지만 tablayout, viewPager2 두 개를 사용해보는건 처음이라 조금 시간이 걸렸다.

toolbar

  • 타이틀을 계속 가운데로 옮기려고 align을 사용해보려고 했지만 적용이 되지 않아서 툴바 내부에 textView를 따로 만들어서 적용시켰다.

프로젝트 구성

  • 아직 프레그먼트를 배우진 않았지만 지금 사용하는 기술도 혼자 공부한 것이기 때문에 그냥 사용해봤다. 왜냐하면 그냥 tapItem을 사용해서 view를 구성하려고 하면 안나온다. 그냥 안된다. 그래서 동적으로 구현했다.

tablayout

  • 의존성 추가

    	implementation 'com.google.android.material:material:1.1.0'
  • 탭 레이아웃은 탭을 표시할 수 있는 수평 레이아웃을 제공하는 것이다.. 화면 전환을 위해 ViewPager와 함께 사용한다. 하지만 명칭대로 레이아웃은 또 아니다. 왜냐하면 레이아웃처럼 마음대로 버튼 등을 배치 할 수 있는게 아니라 그저 나열할 뿐인 Item들을 감싸고만 있는 컨테이너와 오히려 비슷하기 때문이다.

  • ViewPager2와 tablayout을 사용해서 슬라이드로 화면을 넘길 수 있는 화면을 구현했다.

ViewPager2

  • 한 화면에서 여러 뷰를 스와핑해서 전환하는 기능이 필요할 때 사용한다. 여기서 페이지란 여러 뷰가 될 수도 있고 프래그먼트가 될 수 도 있다. 나는 프래그먼트를 사용했다.

  • 의존성 추가

    	implementation 'androidx.viewpager2:viewpager2:1.0.0'
  • ViewPager2는 표시할 새 페이지의 요소로 FragmentStateAdapter 객체를 사용한다

Adapter
  • fragmentActivity: FragmentActivity: 이 생성자 매개변수는 프래그먼트가 속한 액티비티를 나타내다.

  • val count: Int: ViewPager2에 표시할 프래그먼트의 총 개수.

  • getItemCount(): ViewPager2에서 표시할 아이템(프래그먼트)의 총 개수를 반환하는 메서드. 이 메서드에서는 고정된 값을 반환하도록 되어 있다.

  • createFragment(position: Int): 해당 위치(position)에 대한 프래그먼트를 생성하는 메서드. 코드에서는 위치에 따라 다른 프래그먼트를 생성하도록 되어 있다.

  • 총 개수가 2로 고정되어 있는데, 실제로는 count 매개변수를 활용하여 다양한 프래그먼트를 ViewPager2에 추가할 수 있다.

  • createFragment() 메서드도 해당 위치에 따라 다른 프래그먼트를 반환하도록 구현했다. 첫 번째 위치에는 FragmentTodo를, 두 번째 위치에는 FragmentBookMark를 반환하며, 이외의 위치에 대해서는 잘못된 위치 예외를 던진다.

  • 원래 그냥 if문만 쓰고 끝내려 했는데 똑똑한 jetbrain이 허용을 해주지 않아서 예외처리 해버렸다..!

TabLayout과 ViewPager2연결

  • Tab은 ViewPager와 연결되어 사용되는 경우가 많기 때문에 ViewPager2와 TabLayout을 연결한다.

  • ViewPager와 Tab을 연결하기 위해서는 TabLayoutMediator 라는 클래스를 사용해야 함. 이 클래스가 Tab과 ViewPager를 하나처럼 연결시켜준다.

  • 탭의 개수를 늘리고 싶으면 Adapter안에 메소드인 getItemCount 의 리턴수 탭 수에 맞게 조절, createFragment에서 탭 수에 맞게 Fragment추가, TabLayoutMediator에서 추가된 탭 이름 추가, Adapter객체 생성 시 생성자에 주는 개수를 증가시키면 된다.

메인 화면

  • 툴바 레이아웃을 인클루드 시킨 후 viewPager2와 tablayout을 만들어 제약 조건을 주면서 위치 시켰다.

사용 메소드

  • getItemCount() : FragmentStateAdapter의 public method는 아니다. FragmentStateAdapter가 상속하는 Recyclerview.Adapter 클래스의 public method이다. 해당 Adapter가 가지고 있는 data set 안에서의 전체 아이템 수를 리턴하는 메소드이다.

  • createFragment() : FragmentStateAdapter의 public method이다. 특정 포지션에 연결된 새로운 Fragment를 제공하는 기능을 가지고 있는 메소드이다.

  • position : 어댑터에서 데이터 아이템이나 뷰를 가리키는 인덱스 값이다. 데이터 목록이나 페이지들이 표시되는 리스트나 슬라이드 형식의 컨테이너에서 각각의 아이템 또는 페이지가 위치한 위치를 나타낸다.

profile
신입 안드로이드 개발자

0개의 댓글