action bar에 나타나는 메뉴
res > values > themes > themes.xml
<style name="Base.Theme.Android37_EX01" parent="Theme.Material3.DayNight.NoActionBar">
<style name="Base.Theme.Android37_EX01" parent="Theme.Material3.Light">
* ActionBar 보이지 않게 설정 : NoActionBar의 기본 설정
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
- xml 파일을 통한 메뉴 생성
- 메뉴 : ID로 구분
- menuInflater : menu.xml 파일로 만들 수 있는 것
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main_menu, menu) }
- 코드를 통한 메뉴 구성
- 메뉴가 때에 따라 변할 때 사용 (실행할 때 변하는 경우), 저장된 값에 따라 변하는 경우 사용
- 메뉴 : 정수로 구분
- groupId & order = Menu.NONE : 작성한 순서대로 출력
- itemId : 메뉴를 구분하기 위한 값 (FIRST = 1)
- menu?.함수() : null 값이 포함되어 있으면 코드 호출 X
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menu?.add(Menu.NONE, Menu.FIRST, Menu.NONE, "코드 메뉴 1") menu?.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "코드 메뉴 2") // 하위 메뉴 구성 val subMenu = menu?.addSubMenu("코드 메뉴 3") subMenu?.add(Menu.NONE, Menu.FIRST + 2, Menu.NONE, "하위 메뉴 3-1") subMenu?.add(Menu.NONE, Menu.FIRST + 3, Menu.NONE, "하위 메뉴 3-2") menu?.add(Menu.NONE, Menu.FIRST + 4, Menu.NONE, "코드 메뉴 4") return super.onCreateOptionsMenu(menu) }
- xml 파일로 메뉴 구성한 경우
- 메뉴 항목의 ID로 분기
override fun onOptionsItemSelected(item: MenuItem): Boolean { activityMainBinding.run { when(item.itemId) { R.id.menu_item1 -> textView.text = "메뉴 항목1 선택" R.id.menu_item2 -> textView.text = "메뉴 항목2 선택" R.id.menu_item31 -> textView.text = "하위 메뉴 3-1 선택" R.id.menu_item32 -> textView.text = "하위 메뉴 3-2 선택" R.id.menu_item4 -> textView.text = "메뉴 항목4 선택" } } return super.onOptionsItemSelected(item) }
- 코드로 메뉴 구성한 경우
- 설정한 정수 값으로 분기
override fun onOptionsItemSelected(item: MenuItem): Boolean { activityMainBinding.run { when (item.itemId) { Menu.FIRST -> textView.text = "코드 메뉴1 선택" Menu.FIRST + 1 -> textView.text = "코드 메뉴2 선택" Menu.FIRST + 2 -> textView.text = "코드 하위 메뉴 3-1 선택" Menu.FIRST + 3 -> textView.text = "코드 하위 메뉴 3-2 선택" Menu.FIRST + 4 -> textView.text = "코드 메뉴4 선택" } } return super.onOptionsItemSelected(item) }
* action bar에 나타날 경우 : option menu와 똑같이 구현
원할 때 원하는 곳에 띄울 수 있는 메뉴
// textView에 menu가 나타나게 하는 구성
val pop = PopupMenu(this@MainActivity, textView)
menuInflater.inflate(R.menu.popup_menu, pop.menu)
pop.show()
pop.setOnMenuItemClickListener {
when (it.itemId) {
R.id.popup1 -> textView.text = "팝업 메뉴 1 선택"
R.id.popup2 -> textView.text = "팝업 메뉴 2 선택"
R.id.popup3 -> textView.text = "팝업 메뉴 3 선택"
}
true
}
화면에 배치된 View에 설정하는 메뉴
registerForContextMenu(textView)
- textView에 context menu 설정
override fun onCreateContextMenu( menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo? ) { super.onCreateContextMenu(menu, v, menuInfo) if (v != null) { when (v.id) { R.id.textView -> { menu?.setHeaderTitle("textView 메뉴") menuInflater.inflate(R.menu.context_menu, menu); // Fragment인 경우 해당 Fragment가 포함된 activity 이용 // mainactivity.menuInflater.inflate(R.menu.context_menu, menu); } } } }
- listView에 context menu 설정
- menuInfo : 해당 매개변수로 들어오는 객체로 사용자가 길게 누른 항목이 listView의 몇 번째 항목인지 파악 → 가장 중요
override fun onCreateContextMenu( menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo? ) { super.onCreateContextMenu(menu, v, menuInfo) if (v != null) { when (v.id) { R.id.listView -> { val info = menuInfo as AdapterView.AdapterContextMenuInfo menu?.setHeaderTitle("${dataList[info.position]}의 메뉴") menuInflater.inflate(R.menu.list_menu, menu) } } } }
- textView에 context menu 설정
override fun onContextItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.context1 -> activityMainBinding.textView.text = "텍스트뷰 - 메뉴1" R.id.context2 -> activityMainBinding.textView.text = "텍스트뷰 - 메뉴2" R.id.context3 -> activityMainBinding.textView.text = "텍스트뷰 - 메뉴3" } return super.onContextItemSelected(item) }
- listView에 context menu 설정
- menu를 확인하기 위해 길게 누른 뷰가 무엇인지 구분할 방법 X
- item.menuInfo : listView 항목 중 선택된 항목 정보 가져오기
override fun onContextItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.list_menu1 -> { val info = item.menuInfo as AdapterView.AdapterContextMenuInfo activityMainBinding.textView.text = "리스트뷰 - ${dataList[info.position]}의 메뉴1" } R.id.list_menu2 -> { val info = item.menuInfo as AdapterView.AdapterContextMenuInfo activityMainBinding.textView.text = "리스트뷰 - ${dataList[info.position]}의 메뉴2" } R.id.list_menu3 -> { val info = item.menuInfo as AdapterView.AdapterContextMenuInfo activityMainBinding.textView.text = "리스트뷰 - ${dataList[info.position]}의 메뉴3" } } return super.onContextItemSelected(item) }
inner class RecyclerViewAdapter : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolderClass>() {
inner class ViewHolderClass(rowBinding: RowBinding) : ViewHolder(rowBinding.root) {
init {
// context 메뉴 구성 (context 메뉴 활성화)
rowBinding.root.setOnCreateContextMenuListener { menu, v, menuInfo ->
menu.setHeaderTitle("${studentList[adapterPosition].name}")
menuInflater.inflate(R.menu.context_menu, menu)
// context menu의 항목 선택시 실행되는 함수
menu[0].setOnMenuItemClickListener {
studentList.removeAt(adapterPosition)
// recyclerView 갱신
this@RecyclerViewAdapter.notifyDataSetChanged()
false
}
}
}
}
}