[Android] BottomNavigation + ViewPager2

2022. 4. 6. 13:38· Android
목차
  1. BottomNavigation ( + ViewPager2)
  2. 종속성 추가
  3.  
  4. 아이템 추가
  5.  
  6. 메인 레이아웃
  7.  
  8. 뷰페이저 어댑터
  9. 메인 액티비티

 

 

BottomNavigation ( + ViewPager2)

 

종속성 추가

android {
    buildFeatures {
        viewBinding true
    }
}

dependencies {
		...
    implementation "androidx.viewpager2:viewpager2:1.0.0"
}

뷰바인딩을 사용하기 위해 뷰바인딩 속성도 추가해주었다!

 

아이템 추가

 

res → new → Android Resource File

 

Resource type을 Menu로 하고 Directory name도 menu로 해서 리소스 파일을 생성해준다

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item_search"
        android:title="search"/>
    <item
        android:id="@+id/item_favorite"
        android:title="favorite"/>
</menu>

 

해당 파일에서 사용할 아이템들을 정의해준다.

 

메인 레이아웃

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:menu="@menu/menu_bottom"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

뷰페이저 어댑터

 

class ViewPagerAdapter(fragment: FragmentActivity) : FragmentStateAdapter(fragment) {
    
		override fun getItemCount(): Int = FRAGMENTS.size

    override fun createFragment(position: Int): Fragment = FRAGMENTS[position]

    companion object {
        private val FRAGMENTS = listOf(
            SearchFragment(),
            FavoriteFragment()
        )
    }
}

companion object를 사용하여 적용될 fragment들을 list로 넣어 변수를 가져다 쓰도록 했다.

 

 

메인 액티비티

 

class MainActivity : AppCompatActivity() {

		// 전역 변수로 바인딩 객체 선언
    private var _binding: ActivityMainBinding? = null
		// 매번 null 체크를 할 필요 없이 편의성을 위해 바인딩 변수 재 선언
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        _binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

				// 뷰페이저에 어댑터 연결
        binding.viewpager.adapter = ViewPagerAdapter(this)

				// 슬라이드하여 페이지가 변경되면 바텀네비게이션의 탭도 그 페이지로 활성화
        binding.viewpager.registerOnPageChangeCallback(
            object: ViewPager2.OnPageChangeCallback() {
                override fun onPageSelected(position: Int) {
                    super.onPageSelected(position)
                    binding.bottomNavigation.menu.getItem(position).isChecked = true
                }
            }
        )

        binding.bottomNavigation.run {
            setOnItemSelectedListener { item ->
                when(item.itemId) {
                    R.id.item_search -> {
                        binding.viewpager.currentItem = 0
                        true
                    }
                    R.id.item_favorite -> {
                        binding.viewpager.currentItem = 1
                        true
                    }
                    else -> false
                }
            }
        }
    }

		// 액티비티가 destroy될 때 binding class 인스턴스 참조 정리
    override fun onDestroy() {
        super.onDestroy()
        _binding = null
    }
}
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Kotlin] 코틀린 기본 문법 (1)  (0) 2022.08.09
[Android] Activity란?  (0) 2022.08.09
[Android] 코루틴 Coroutine  (0) 2022.04.01
[Android] 액티비티 컴포넌트 - 액티비티 ANR 문제와 코루틴  (0) 2022.01.05
[Android] 액티비티 컴포넌트 - 액티비티 생명주기  (0) 2022.01.05
  1. BottomNavigation ( + ViewPager2)
  2. 종속성 추가
  3.  
  4. 아이템 추가
  5.  
  6. 메인 레이아웃
  7.  
  8. 뷰페이저 어댑터
  9. 메인 액티비티
'Android' 카테고리의 다른 글
  • [Kotlin] 코틀린 기본 문법 (1)
  • [Android] Activity란?
  • [Android] 코루틴 Coroutine
  • [Android] 액티비티 컴포넌트 - 액티비티 ANR 문제와 코루틴
YOONJELLY
YOONJELLY
YOONJELLY
JELLYJELLY
YOONJELLY
전체
오늘
어제
  • 분류 전체보기 (153)
    • Springboot (2)
    • Android (15)
    • Algorithm (126)
      • 개념 (8)
      • BOJ (91)
      • Programmers (15)
      • SWEA (4)
    • 경험_기록 (1)
    • RIM_TIP (4)
    • Github (2)
    • CS (1)
      • 운영체제 (1)
      • 컴퓨터네트워크 (0)
      • 정보처리기사 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BFS
  • SWEA
  • 큐
  • 백준
  • programmers
  • 자료구조
  • 코틀린
  • 알고리즘
  • 정렬
  • 완전탐색
  • 소프티어
  • 이진탐색
  • 액티비티컴포넌트
  • 프로그래머스
  • kotlin
  • 코딩테스트
  • 이것이코딩테스트다
  • 문자열
  • DP
  • BOJ
  • 딕셔너리
  • 그리디
  • 스택
  • 다이나믹프로그래밍
  • Android
  • 안드로이드
  • softeer
  • 파이썬
  • Python
  • DFS

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
YOONJELLY
[Android] BottomNavigation + ViewPager2
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.