메뉴 구성
메뉴는 액션바의 중요한 구성 요소로 액티비티 화면에서 사용자 이벤트를 사용할 수 있도록 합니다. 액티비티에 메뉴를 추가하면 액션바 오른쪽에 오버플로 버튼이 나타나고 이 버튼을 누르면 메뉴가 아래로 확장되어 나타납니다. 그리고 오버플로 메뉴 중에 몇몇은 액션바에 아이콘으로 나오게 할 수 있습니다. 이를 액션 아이템(혹은 액션 버튼)이라고 합니다. 결국 오버플로 메뉴와 액션 아이템 모두 메뉴입니다.
액티비티에 메뉴를 추가하고 싶다면 onCreateOptionsMenu()와 onPrepareOptionsMenu() 함수를 이용할 수 있습니다.
함수 | 설명 |
onCreateOptionsMenu() | 액티비티가 실행되면서 처음에 한 번만 호출(정적) |
onPrepareOptionsMenu() | 액티비티가 실행되면서 한 번 호출된 후 오버플로 메뉴가 나타날 때마다 반복해서 호출(동적) |
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val menuIteml: MenuItem? = menu?.add(0, 0, 0, "menul")
val menuItem2: MenuItem? = menu?.add(0, 1, 0, "menu2")
return super.onCreateOptionsMenu(menu)
}
onCreateOptionsMenu() 함수의 매개변수로 전달되는 Menu 객체를 메뉴바로 생각하면 되고, 이 Menu 객체에 메뉴를 추가할 때 다음과 같이 add() 함수를 이용합니다.
fun add (groupId: Int, itemId: Int, order: Int, title: CharSequence!): MenuItem!
메뉴를 사용자가 선택했을 때의 이벤트 처리는 onOptionsItemselected() 함수를 이용합니다. 이 함수의 매개변수는 이벤트 가 발생한 메뉴 객체인 MenuItem입니다. MenuItem의 itemId 속성으로 이벤트가 발생한 메뉴 객체의 식별 값을 얻어서 이벤트를 처리합니다.
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
0 -> {
Log.d("kkang", "nenul click")
true
}
1 -> {
Log.d("kkang", "menu2 click")
true
}
else -> super.onOptionsItemSelected(item)
}
리소스로 메뉴 구현
액티비티의 메뉴는 대부분 정적으로 제공되므로 코드가 아니라 리소스 XML 파일로 구성합니다. 메뉴를 구성하는 XML 파일은 res 폴더 아래 menu 디렉터리에 만듭니다.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menul"
android:title="menu1" />
<item
android:id="@+id/menu2"
android:icon="@android:drawable/ic_menu_add"
android:title="menu2"
app: showAsAction="always" />
<item
android:id="@+id/menu3"
android:icon="@android:drawable/ic_menu_search"
android:title="menu2"
app : showAsAction="ifRoom" />
</menu>
메뉴 XML의 <item> 태그 하나가 메뉴 하나에 해당합니다. id 속성은 레이아웃 XML에서 뷰의 id값과 마찬가지로 메뉴를 식별하는 데 사용합니다. title과 icon 속성은 메뉴 문자열과 아이콘을 지정합니다. 메뉴는 기본으로 오버플로 메뉴로 나오는데, 만약 액션바에 아이콘으로 나타나게 하려면 showAsAction 속성을 이용합니다. showAsAction 속성 값에는 다음 3가지 가운데 하나를 지정하면 됩니다.
showAsAction 속성값 | 설명 |
never(기본) | 항상 오버플로 메뉴로 출력합니다. |
ifRoom | 만약 액션바에 공간이 있다면 액션 아이템으로, 없다면 오버플로 메뉴로 출력합니다. |
always | 항상 액션 아이템으로 출력합니다. |
이제 이 XML을 액티비티 코드에 적용해 줘야 합니다.
override fun onCreateOptions Menu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return super.onCreateOptionsMenu(menu)
}
menuInflater는 MenuInflater 타입의 속성이며 이 객체의 inflate() 함수에 매개변수로 메뉴 XML 파일을 명시하면 액티비티에 메뉴가 적용됩니다.