https://developer.android.com/guide/topics/ui/menus#PopupMenu
메뉴 | Android 개발자 | Android Developers
메뉴 메뉴는 수많은 유형의 애플리케이션에서 사용되는 보편적인 사용자 인터페이스 구성요소입니다. 친숙하고 일관적인 사용자 경험을 제공하기 위해 Menu API를 사용하여 활동에서 사용자 작
developer.android.com
메뉴
안드로이드 메뉴에는 여러 종류가 있다.
대표적으로 3가지 메뉴가 존재하는데,
- 옵션 메뉴 (Option Menu)
- 컨텍스트 메뉴 (Context Menu)
- 팝업 메뉴 (Popup Menu)
옵션 메뉴의 경우, 모바일 상단에 위치한 메뉴를 말한다.

컨텍스트 메뉴의 경우, 보통 View를 꾹 눌렀을 때 화면 중앙에 등장하는 메뉴를 말한다.

팝업 메뉴의 경우, View에 고정된 메뉴로서 화면 공간에 따라 위로 나타나기도, 아래에 나타나기도 한다. 이미지뷰에 고정시킬 수도, 버튼에 고정시킬 수도 있다.

팝업 메뉴
팝업 메뉴는 다음과 같은 상황에서 사용된다.
- overflow-style 의 메뉴를 만들어 특정 content와 연관된 행동을 수행할 때
: image view와 같은 view에 메뉴를 할당하는 것을 의미? - 명령문의 두번째 부분을 제공할 때
: 'add' 버튼이 있고 버튼을 누르면 여러가지 'add' option이 제공되는 형태 - 'Spinner'와 유사한 drop-down 형식의 메뉴를 제공할 때
: Spinner : ex) 회원가입 시, 나라 선택할 때 밑에 쫘르륵 국가 리스트가 뜨고, 거기서 선택하는 것.
팝업 메뉴 생성하기
- 팝업 메뉴를 객체화 한다.
PopupMenu 클래스를 사용하여 팝업 메뉴의 객체를 생성한다.
팝업 메뉴를 생성하기 위해선 현재 application 의 context 와 메뉴가 부착(고정)될 view를 넘겨주어야 한다.
PopupMenu(Application.Context, View) - PopupMenu의 Menu Inflater 정의.
'Menu resource(.xml)'를 'Menu객체(1번 객체)'에 inflate 하는 역할 수행.
PopupMenu.menuInflater - Menu inflater를 사용하여 inflate
menuInfalter.inflate(R.menu.id, popupMenu.menu) - PopupMenu.show()
fun showPopupMenu(view : View) {
//1번
val popupMenu = PopupMenu(this, view)
//2번
val popUpMenuInflater = PopupMenu.menuInflater
//3번
popUpMenuInflater.inflate(R.menu.actions, popupMenu.menu)
//4번
popupMenu.show()
}
간단버전
fun showPopupMenu(view : View) {
val popupMenu = PopupMenu(this, view)
popupMenu.menuInflater.inflate(R.menu.actions, popupMenu.menu)
popupMenu.show()
}
팝업 메뉴 ClickListener Handling
팝업 메뉴의 메뉴 클릭에 대해 handling을 구현하기 위해서는
현재 클래스에 PopupMenu.OnMenuItemClickListener를 구현(implement)시켜야 한다.
class tmpFragment : Fragment(), PopupMenu.OnMenuItemClickListener {
override fun onMenuItemClick(item:MenuItem?) : Boolean {}
}
유저가 메뉴 아이템을 클릭할 때 시스템에선 OnMenuItemClick을 호출한다. 따라서 OnMenuItemClick() 내에 코드를 구현한 뒤, PopupMenu.setOnMenuItemClickListener() 에 register 한다.
fun showPopupMenu(view: View) {
val popupMenu = PopupMenu(this.activity, view)
popupMenu.setOnMenuItemClickListener(this@SolaroidFrameFragment)
popUp.menuInflater.inflate(R.menu.fragment_frame_popup_menu, popUp.menu)
}
override fun onMenuItemClick(item:MenuItem?) : Boolean{
return when(item.itemId) {
R.id.filter_favorite -> {
...
true
}
else -> false
}
}
- popupMenu.setOnMenuItemClickListener() -> this를 넘겨주면, 클래스 내에 재정의된 onMenuItemClick()가 register 된다.