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 파일 추가 및 선언

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

+ Recent posts