먼저 build.gradle에 아래 코드들을 추가해준다
plugins {
id 'kotlin-kapt'
}
dependencies {
implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
implementation("androidx.navigation:navigation-ui-ktx:2.7.7")
}
build.gradle(Module)
그리고 Activity와 Fragment들을 생성해준다
# Navigation Graph 생성
res 폴더 아래에 navigation 디렉터리를 만들고, nav_graph.xml 파일을 생성한다
<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
app:startDestination="@id/mapFragment">
<fragment
android:id="@+id/mapFragment"
android:name="nbc.group.recipes.presentation.fragment.MapFragment"
android:label="fragment_map"
tools:layout="@layout/fragment_map" />
<fragment
android:id="@+id/bookmarkFragment"
android:name="nbc.group.recipes.presentation.fragment.BookmarkFragment"
android:label="fragment_bookmark"
tools:layout="@layout/fragment_bookmark" />
</navigation>
nav_graph.xml
navigation
- app:startDestination="@+id/mapFragment" 속성을 추가한다
앱 실행 시 가장 처음 뜨는 프래그먼트를 지정하는 속성이다
fragment
- 프래그먼트들을 모두 정의해둔다
- name: 프래그먼트 파일의 경로를 넣어준다
- layout: 프래그먼트의 xml파일을 연결해준다
# Menu 생성
res 폴더 아래에 menu 디렉터리를 만들고, nav_menu.xml 파일을 생성한다
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/mapFragment"
android:icon="@drawable/ic_home"
android:title="home"/>
<item
android:id="@+id/bookmarkFragment"
android:icon="@drawable/ic_bookmark"
android:title="bookmark"/>
</menu>
nav_menu.xml
주의할점!! - id를 내비게이션 그래프의 프래그먼트 id와 동일하게 작성해야 맵핑을 통해 바텀내비게이션바로 만들어줄 수 있다.
- icon: 바텀내비게이션에 표시될 아이콘 이미지를 연결한다.
- title: 바텀내비게이션에 표시될 레이블 텍스트를 작성한다.
# 클릭 시 색상지정
아이템을 클릭한 상태와 클릭하지 않은 상태에 색을 다르게 주기 위한 파일을 drawble에 생성해준다
android:state_checked="true"가 클릭한 상태, false가 클릭하지 않은 상태다
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 클릭했을 경우 -->
<item android:state_checked="true" android:color="@color/green1" />
<!-- 클릭하지 않은 경우 -->
<item android:state_checked="false" android:color="@color/black" />
</selector>
bottom_navigation_color.xml
# activtiy_main 레이아웃
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".presentation.MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fcv"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
app:layout_constraintBottom_toTopOf="@id/bottomNav_bar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNav_bar"
android:layout_width="match_parent"
android:layout_height="70dp"
app:itemIconTint="@drawable/bottom_navigation_color"
app:itemTextColor="@drawable/bottom_navigation_color"
app:labelVisibilityMode="labeled"
app:menu="@menu/menu"
app:itemActiveIndicatorStyle="@android:color/transparent"
app:itemBackground="@android:color/transparent"
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fcv"/>
</androidx.constraintlayout.widget.ConstraintLayout>
activtiy_main.xml
- android:name="androidx.navigation.fragment.NavHostFragment"
탐색 그래프에서 대상을 표시하는 빈 컨테이너인 NavHost 역할을 하도록 설정한다 - app:navGraph="@navigation/nav_graph"
NavHostFragment와 내비게이션 그래프를 연결시킨다
- app:defaultNavHost="true"
뒤로가기 버튼을 누르면 NavHostFragment로 돌아오게 설정한것
기본값은 false이고, 뒤로가기 버튼을 누르면 앱이 종료된다
- BottomNavigationView
- app:labelVisibilityMode="labeled"
아이콘 밑의 레이블을 보이게 설정한다. 숨기고 싶으면 unlabeled로 설정한다.
- app:itemIconTint="@drawable/bottom_navigation_color"
app:itemTextColor="@drawable/bottom_navigation_color". 아이콘과 레이블의 색상을 지정해주는 속성인데, 아이템을 클릭한 상태와 클릭하지 않은 상태에 색을 다르게 주기 위해 위에서 만들었던 selector를 연결해준다.
- app:itemBackground="@android:color/transparent"
아이템을 클릭할 때 검은 원이 퍼져나가는 ripple효과를 제거하기 위한 속성이다.
# MainActivtiy
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var navController: NavController
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
initNavigation()
}
override fun onSupportNavigateUp(): Boolean {
navController = findNavController(R.id.fcv)
return navController.navigateUp() || super.onSupportNavigateUp()
}
private fun initNavigation() {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fcv) as NavHostFragment
val navController = navHostFragment.findNavController()
binding.bottomNavBar.setupWithNavController(navController)
}
}
MainActivtiy.kt
이렇게하면 잘 실행되는것을 확인할 수 있다!!
# 참고자료
[Android / Kotlin] Bottom Navigation View 구현하기 (Jetpack Navigation)
Jetpack 라이브러리의 Navigation 컴포넌트를 정리하고, 이 Navigation을 이용해 BottomNavigationBar를 만들어보자! 호이팅 호이팅 🐱
velog.io
https://hayeon1549.tistory.com/2
[Android/Kotlin] Jetpack Bottom Navigation Bar
미리보기 Jetpack Navigation은 UI 전환을 쉽게 구현할 수 있도록 도와준다. Navigation을 자동으로 연결해주어 불필요한 코드 작성을 줄이고, 유지보수에도 용이하다. 또한 Back Stack 관리 등 여러 장점으
hayeon1549.tistory.com
[Android/Kotlin] Single Activity Architecture(SAA)를 쓰는 이유, 및 적용해보기
Jetpack은 개발자가 관심 있는 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 축소, 모든 Android 버전 및 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음입니다.안드로이드
velog.io
'개발 노트 > Kotlin' 카테고리의 다른 글
[Android/Kotlin]Kakao 주소검색 API 사용해서, 지도에서 지역검색 데이터 받아오기 (0) | 2024.05.30 |
---|---|
[Android/Kotlin] KakaoMap 주소 검색 API [HTTP 401에러] (0) | 2024.05.29 |
[Android/Kotlin] KakaoMap API Android v2 사용하기 (1) | 2024.05.27 |
[Android/Kotlin] Paging3란? (0) | 2024.05.27 |
[Android/Kotlin] collect과 collectLatest의 차이점? [Flow] (0) | 2024.05.27 |