안드로이드 툴바에는 메뉴를 추가할 수 있습니다.
위 그림에서 점 세개로 표현된 이미지를 클릭하면 등록된 XML 메뉴 리스트를 보여줍니다.
툴바에 메뉴를 inflate 시키는 방법을 검색해보면 대부분 액티비티에서 onCreateOptionsMenu(menu: Menu?)
메소드를 통해 메뉴를 툴바에 입히고(inflate), 선택된 메뉴에 대한 이벤트 처리는 onOptionsItemSelected(item: MenuItem): Boolean
을 통해서 처리하는 것을 볼 수 있습니다.
이러한 방법은 툴바를 액티비티에 속해 있는 ActionBar로 취급할 때 사용되는 방법입니다.
만약 툴바를 액티비티 내에 종속시키지 않고, 각 프래그먼트마다 별개로 구현한다면 메뉴를 구성하기 위한 위 메소드들을 프래그먼트에서 가로채야만 합니다.
// SomeFragment.kt
override onCreateView(inflater: LayoutInflater, parent: ViewGroup, saved: Bundle) {
setHasOptionsMenu(true) // 프래그먼트에서 옵션을 처리하겠다고 액티비티에 알리는 과정
// ...
}
// 프래그먼트에서 사용할 별도의 메뉴를 입혀주는 과정
override onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu.xml, menu)
super.onCreateOptionsMenu(menu, inflater)
}
예제
테스트를 위해서 안드로이드 스튜디오에서 Navigation Drawer를 가진 기본 프로젝트를 생성하여 툴바 예제를 작성합니다.
테스트 프로젝트는 Home, Gallery, Slideshow 세 개의 프래그먼트 화면을 가진 구성입니다.
안드로이드 스튜디오에서 기본 생성한 코드는 툴바를 ActionBar로 사용해서 액티비티를 통해서 제어하도록 하고 있습니다.
그리고 액티비티의 메소드인 아래 두 메소드를 통해서 메뉴를 입히고 클릭 이벤트를 수신합니다.
하지만 세 가지 프래그먼트 중 "HomeFragment" 일때는 다른 메뉴를 보여주고 싶다면 어떻게 해야할까요?
HomeFragment에서 메뉴를 덫입히는 작업을 해야합니다.
예제 실행
로그를 확인하면 MainActivity와 HomeFragment가 onOptionsItemSelected()
에서 메뉴를 구별하는 것을 볼 수 있습니다.
ActionBar를 사용하지 않는다면?
하지만 Toolbar는 일반 View처럼 다룰 수 있고, 더 이상 ActionBar로 처리하지 않아도 동일한 기능을 수행할 수 있습니다.
Toolbar를 setSupportActionBar(toolbar)를 통해서 액티비티에 종속시키지 않으면 더 유연하고 깔끔하게 아래와 같은 구현이 가능합니다.
메뉴 아이템의 클릭이벤트를 읽는 과정도 툴바를 View로 취급할 경우 버튼에 리스너를 등록하는 것과 유사하게 사용할 수 있습니다.
그리고 각 프래그먼트마다 Toolbar를 Layout에 추가하여 사용하는 것도 가능합니다.
Toolbar.OnMenuItemClickListener
를 사용하면 더 이상 액티비티의 onCreateOptionsMenu()
, onOptionsItemSelected()
를 오버라이딩하지 않아도 툴바의 메뉴를 제어할 수 있습니다.
menu_main.xml
을 툴바에 메뉴로 추가하는 과정은
toolbar.inflateMenu(R.menu.menu_main) // XML 메뉴를 등록
toolbar.getMenu().clear() // 등록된 메뉴를 삭제
결론
Toolbar를 사용할 때, 아주 낮은 버전의 안드로이드 앱을 개발하거나, 특별히 ActionBar를 고집해야할 이유가 없다면
툴바는 다른 뷰 위젯들과 마찬가지로 View로써 컨트롤하는 것이 가장 깔끔하게 사용할 수 있습니다.
안드로이드 5.0 (API 21) 이상은 Toolbar를 액션바로 등록하지 않고 사용하는 것을 추천합니다.
'Android' 카테고리의 다른 글
NavigationDrawer와 Toolbar 연동하기 (0) | 2021.12.02 |
---|---|
Toolbar와 ActionBar의 차이점 (0) | 2021.12.02 |
Android Abstraction Between Packages (0) | 2021.10.27 |
(Part.2) 리사이클러뷰에서 여러가지 타입의 데이터 사용하기 (0) | 2020.04.13 |
(Part.1) 리사이클러뷰에서 여러 타입의 데이터 사용하기 (0) | 2020.04.13 |