1. gradle 추가
- implementation 'com.google.android.material:material:1.1.0'
2. activity에 com.bottomnavigation.BottomNavigationView 추가
- labelVisibilityMode : 바텀네비메뉴의 글자 보이기 여부(unlabeled :안보임)
- itemIconSize : 아이콘 사이즈
3. Menu 추가
- ResourceDirectory → menu 추가
- menu.xml 추가 , menu.xml에 item 추가
- fragment 파일 추가
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/i1"
android:enabled="true"
android:icon="@drawable/ic_baseline_settings_24"
android:title="아이템1" />
<item
android:id="@+id/i2"
android:enabled="true"
android:icon="@drawable/ic_baseline_settings_24"
android:title="아이템2" />
<item
android:id="@+id/i3"
android:enabled="true"
android:icon="@drawable/ic_baseline_settings_24"
android:title="아이템3" />
</menu>
4. fragment 파일 추가 및 선언
- fragment 작성 : https://1sam1.tistory.com/30
- fragment 선언
private val mapFragment: MapFragment by lazy { MapFragment.newInstance() }
- 첫번째 프래그먼트는 add로 선언
supportFragmentManager.beginTransaction().add(R.id.fragment_view, mapFragment).commit()
5. setOnItemSelectedListener를 사용하여 변경될 프래그먼트 설정
binding.bottomNav.setOnItemSelectedListener{
when(it.itemId) {
R.id.menu_category-> {
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, categoryFragment).commit()
}
R.id.menu_bookmark-> {
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, bookmarkFragment).commit()
}
R.id.menu_map-> {
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, mapFragment).commit()
}
R.id.menu_info-> {
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, infoFragment).commit()
}
}
true
}
6. 뒤로가기 클릭 시 전 프래그먼트 이동
supportFragmentManager.popBackStackImmediate("category", FragmentManager.POP_BACK_STACK_INCLUSIVE)
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, categoryFragment, "category").addToBackStack("category").commit()
- 프래그먼트 뒤로가기는 실행이 되지만, 바텀 네비게이션 뷰에는 적용되지 않음
private fun replaceFragment(binding: ActivityMainBinding) {
binding.bottomNav.setOnItemSelectedListener{
when(it.itemId) {
R.id.menu_category-> {
supportFragmentManager.popBackStack("category", FragmentManager.POP_BACK_STACK_INCLUSIVE)
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, categoryFragment, "category").addToBackStack("category").commit()
}
R.id.menu_bookmark-> {
supportFragmentManager.popBackStack("bookmark", FragmentManager.POP_BACK_STACK_INCLUSIVE)
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, bookmarkFragment, "bookmark").addToBackStack("bookmark").commit()
}
R.id.menu_map-> {
supportFragmentManager.popBackStack("map", FragmentManager.POP_BACK_STACK_INCLUSIVE)
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, mapFragment, "map").addToBackStack("map").commit()
}
R.id.menu_info-> {
supportFragmentManager.popBackStack("info", FragmentManager.POP_BACK_STACK_INCLUSIVE)
supportFragmentManager.beginTransaction().replace(R.id.fragment_view, infoFragment, "info").addToBackStack("info").commit()
}
}
true
}
}
private fun updateBottomMenu() {
val tag1: Fragment? =supportFragmentManager.findFragmentByTag("category")
val tag2: Fragment? =supportFragmentManager.findFragmentByTag("bookmark")
val tag3: Fragment? =supportFragmentManager.findFragmentByTag("map")
val tag4: Fragment? =supportFragmentManager.findFragmentByTag("info")
binding.bottomNav.apply{
if(tag1 != null && tag1.isVisible) {
this.menu.findItem(R.id.menu_category).isChecked= true
}
if(tag2 != null && tag2.isVisible) {
this.menu.findItem(R.id.menu_bookmark).isChecked= true
}
if(tag3 != null && tag3.isVisible) {
this.menu.findItem(R.id.menu_map).isChecked= true
}
if(tag4 != null && tag4.isVisible) {
this.menu.findItem(R.id.menu_info).isChecked= true
}
}
}
참고
https://hwanine.github.io/android/backstack2/
https://junyoung-developer.tistory.com/153
https://velog.io/@kimbsu00/Android-8
'기술적용' 카테고리의 다른 글
Databinding 구현 (0) | 2022.03.21 |
---|---|
Fragment 작성 (0) | 2022.03.20 |
키보드 컨트롤 (0) | 2022.03.18 |
Recyclerview 구현 (0) | 2022.03.17 |
Fragment 데이터 전달 (0) | 2022.03.17 |