안드로이드 23) JetPack의 View (1)

밍나·2022년 2월 4일
1

Android

목록 보기
23/36

JetPack

1. JetPack

  • JetPack이란 구글에서 안드로이드 개발을 위해 지원하는 다양한 라이브러리의 집합
  • 대부분 androidx로 시작하는 패키지명을 사용하는 라이브러리
  • 크게 AAC와 androidx 라이브러리로 나누어짐
  • JetPack 기능
    • 앱 개발의 권장 아키텍처 제공(AAC)
    • API Level에 의한 호환성 문제 해결
    • 표준에서 제공하지 못하는 다양한 기능 제공

2. 종류

  • androidx.appcompat : 앱의 코어 부분 제공, API Level 호환성 문제 해결하기 위한 라이브러리
  • androidx.recyclerview : 목록화면 구성 라이브러리
  • androidx.viewpager2 : 스와이프에 의한 화면 구성 라이브러리
  • androidx.fragment : 액티비티처럼 동작하는 뷰 제공 라이브러리
  • androidx.drawerlayout : 옆에서 밀리면서 보여지는 화면 구성 라이브러리
  • Android 개발자 페이지(https://developer.android.com/jetpack/androidx/explorer?hl=ko&case=ui)에서 더 많은 종류 확인 가능

Fragment

1. Fragment

  • 프래그먼트는 뷰
  • 자체적으로는 화면에 아무것도 출력되지 않는다
  • 액티비티처럼 동작하는 뷰(UI 구성, menu 구성, lifecycle)
  • 액티비티에 작성할 수 있는 모든 코드를 프래그먼트에 작성 가능

2. Fragment 사용 이유
1) 화면이 복잡한 경우

  • 하나의 화면이 하나의 액티비티인데 화면이 복잡하고 업무 로직이 복잡해지면 코드가 길어짐
  • Fragment는 화면 구성요소의 일부를 코드적으로 분리하기 위해 사용
    • 일반 뷰는 액티비티처럼 동작하지 않아 일반뷰로는 분리할 수 없음
    • 따라서 프래그먼트로 분리
  • 최종 액티비티가 분리한 프래그먼트 뷰를 모두 뿌려서 출력

2) 화면 전환

  • 한 액티비티에서 선택에 의해 다른 화면으로 전환할 때 Intent로 다른 액티비티를 실행해도 됨
    • 선택의 가지수에 따라 액티비티 수도 늘어남
  • Fragment를 이용하면 한 액티비티에서 항목에 따라 선택의 가지수만큼 Fragment만 만들어서 실행시키면 됨

3. Fragment 사용 방법
1) Fragment 상속

class OneFragment: Fragment() {

}
  • 프래그먼트는 Fragment를 상속 받아 작성하는 클래스

2) 레이아웃 등록

<fragment
    android:name="com.example.OneFragment"
    android:id="@+id/fragmentView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  • name 속성으로 fragment 클래스 등록

4. 동적으로 Fragment 출력

val fragmentManager: FragmentManagre = supportFragmentManager
val transaction: FragmentTransaction = fragmentManager.beginTransaction()

transaction.add(R.id.fragment_content, oneFragment)
transaction.commit()
  • Activity 코드에서 동적으로 Fragment를 출력하기 위해서는 FragmentManager 사용해서 FragmentTransaction을 얻어낸다.
  • add(int containerViewId, Fragment fragment) : 새로운 Fragment를 화면에 추가, id 영역에 추가
  • replace(int containerViewId, Fragment fragment) : id 영역에 추가된 Fragment를 대체
  • remove(Fragment fragment) : 추가된 Fragment 제거
  • commit() : 화면 적용

RecyclerView

1. RecyclerView

  • RecyclerView는 목록 화면을 만들기 위해 사용되는 뷰
  • ListView와 RecyclerView 비교
ListViewRecyclerView
platform에서 제공하는 표준 apiandroidx에서 제공
필수요소 : Adapter필수요소 : Adapter, ViewHolder, LayoutManager
목록화면 커스터마이징 어려움목록화면 커스터마이징 쉬움
아이템 생성시 뷰바인딩을 계속해 성능저하 발생아이템 생성시 뷰바인딩 한번만 하고 이후에는 아이템 생성할 때
바인딩 된 뷰 객체를 재활용

  • RecyclerView 구성 요소
    • Adapter : (필수) 항목을 구성하는 역할
    • ViewHolder : (필수) 항목에 필요한 뷰 객체를 가지는 역할
    • LayoutManager : (필수) 항목을 배치하는 역할
    • ItemDecoration : (옵션) 항목을 꾸미기 위한 역할

2. RecyclerView 사용 방법
1) ViewHolder 작성

class MyViewHolder(val binding: ItemMainBinding): RecyclerView.ViewHolder(binding.root)
  • ViewHolder는 RecyclerView.ViewHolder를 상속받아 작성
  • View 변수를 선언하고 findViewById로 뷰 객체 얻어야 함
    • ViewBinding을 이용하게 되면 ViewBinding 객체만 유지하면 위의 과정이 필요X

2) Adapter 작성

class MyAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    override fun getItemCount(): Int {
        TODO("Not yet implemented")
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        TODO("Not yet implemented")
    }
    
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int): Int {
        TODO("Not yet implemented")
    }
}
  • Adapter는 RecyclerView.Adapter를 상속 받아 작성
  • getItemCount() : 항목 개수를 판단하기 위해 자동 호출
  • onCreateViewHolder() : 항목의 뷰를 가지는 ViewHolder를 준비하기 위해 자동 호출, 뷰홀더 객체를 생성해서 리턴
  • onBindViewHolder() : onCreateViewHolder로 리턴시킨 ViewHolder 객체의 뷰 항목의 데이터를 출력하거나 이벤트를 걸기 위해서 자동 호출

3) LayoutManager과 Adapter 등록

binding.recycler.layoutManager = LinearLayoutManager(this)
binding.recycler.adapter = MyAdapter(datas)
  • LayoutManager : RecyclerView에 배치해주는 역할
    • LinearLayoutManager : 가로 혹은 세로 방향으로 항목 배치
    • GridLayoutManager : Grid로 항목 배치
    • StaggeredGridLayoutManager : 높이가 불규칙한 Grid로 항목 배치

ViewPager2

1. ViewPager2

  • ViewPager는 스와이프 이벤트(손으로 화면을 미는 이벤트)에 의한 화면 전환을 목적
  • ViewPager는 여러 항목을 각각 화면 한장으로 뿌려주는 어댑터 뷰
  • androidx.viewpager 라이브러리와 별개로 2019년 androidx.viewpager2가 새롭게 발표
  • androidx.viewpager2 구현할 것을 권장

2. ViewPager2 사용 방법
1) build.gradle 추가

implementation 'androidx.viewpager2:viewpager2:1.0.0'

2) 레이아웃 등록

<androidx.viewpager2.widget.ViewPager2 xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

3) Adapter 작성

  • ViewPager2에서는 두가지 Adapter를 제공
    • RecyclerView.Adapter
    • FragmentStateAdapter

① RecyclerView.Adapter

class MyPagerViewHolder(val binding: ItemPagerBinding): RecyclerView.ViewHolder(binding.root)

class MyPagerAdapter(val datas: MutableList<String>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    override fun getItemCount(): Int {
        return datas.size
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = 
        MyPagerViewHolder(ItemPagerBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int): Int {
    }
}
  • RecyclerView.Adapter는 RecyclerView에서 살펴보았던 내용과 차이가 없다

② FragmentStateAdapter (common)

class MyFragmentPagerAdapter(activity: FragmentActivity): FragmentStateAdapter(activity){
    val fragments: List<Fragment>
    init{
        fragments = listOf(OneFragment(), TwoFragment(), ThreeFragment())
        Log.d("minha-fragment", "fragments size: ${fragments.size}")
    }
    
    override fun getItemCount(): Int = fragments.size
    
    // 매개변수에 들어가는 인덱스에 해당하는 fragment 출력
    override fun createFragment(position: Int): Fragment = fragments[position]
  • ViewPager의 항목이 프래그먼트로 작성되었다면 FragmentStateAdapter를 이용
  • FragmentStateAdapter를 상속받아 Adapter 작성
  • getItemCount() 함수와 createFragment() 함수를 오버라이드
  • createFragment() 함수에서 리턴시킨 Fragment 객체가 각 항목에 출력

4) 화면 방향 조정

binding.viewpager.orientation = ViewPager2.ORIENTATION_VERTICAL
  • 화면 방향 조정 가능
  • 기본으로 가로 방향이 적용, 세로 방향으로 나오게 하려면 orientation 속성값 조정
profile
🤗🤗🤗

0개의 댓글