본문 바로가기

Android

Toolbar에 메뉴 추가하기

기본적인 툴바의 형태

 

안드로이드 툴바에는 메뉴를 추가할 수 있습니다.

위 그림에서 점 세개로 표현된 이미지를 클릭하면 등록된 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로 사용해서 액티비티를 통해서 제어하도록 하고 있습니다.

 

setSupportActionBar

 

 

그리고 액티비티의 메소드인 아래 두 메소드를 통해서 메뉴를 입히고 클릭 이벤트를 수신합니다.

 

 

 

하지만 세 가지 프래그먼트 중 "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를 액션바로 등록하지 않고 사용하는 것을 추천합니다.

 

툴바와 액션바에 대해서 더 알아보기