안드로이드 개발자의 창고
[34일차 Android] Option Menu 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Option Menu
- 안드로이드에서 화면 하나당 하나씩 가질 수 있는 메뉴를 의미하며 현재 보이는 화면(Activity)의 메인 메뉴가 된다.
onCreateOptionsMenu
- 화면을 관리하는 객체인 Activity 객체가 만들어 질 때 자동으로 호출되는 메서드이며 여기에서 메뉴를 생성하게 된다.
- 메서드가 true를 반환하면 메뉴가 나타난다.
OnOptionsItemSelected
- 사용자가 메뉴를 선택했을 때 자동으로 호출되는 메서드이다.
예제 코드
main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_item1"
android:title="메뉴 항목1" />
<item
android:id="@+id/menu_item2"
android:title="메뉴 항목2" />
<item
android:id="@+id/menu_item3"
android:title="메뉴 항목3" >
<menu >
<item
android:id="@+id/menu_item31"
android:title="하위 메뉴 3-1" />
<item
android:id="@+id/menu_item32"
android:title="하위 메뉴 3-2" />
</menu>
</item>
<item
android:id="@+id/menu_item4"
android:title="메뉴 항목4" />
</menu>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
}
// 옵션 메뉴를 구성하기 위해 사용하는 메서드
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
// menuInflater.inflate(R.menu.main_menu, menu)
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 true
}
// 옵션 메뉴에서 메뉴 항목을 선택하면 호출되는 메서드
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를 선택했습니다."
}*/
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)
}
}
코드 리뷰
- override fun onCreateOptionsMenu(menu: Menu?): Boolean { ... }
- menuInflater.inflate(R.menu.main_menu, menu) : 작성한 main_menu.xml 파일을 layout으로 설정하여 메뉴를 생성한다.
- menu?.add(Menu.NONE, Menu.FIRST, Menu.NONE, "코드 메뉴 1") : menu를 코드로 작성하여 생성한다.
- val subMenu = menu?.addSubMenu("코드 메뉴 3") : 하위 menu를 생성하기 위한 코드
- override fun onOptionsItemSelected(item: MenuItem): Boolean { ... }
- 첫번째 주석 처리된 when(item.itemId){ ... } : main_menu.xml 파일 내부의 menu item의 id를 사용하여 처리하는 코드
- 두번째 when(item.itemId){ ... } : 코드로 작성한 menu의 int 값을 사용하여 처리하는 코드
결과
'Computer > Android' 카테고리의 다른 글
[34일차 Android] Popup Menu (0) | 2023.06.17 |
---|---|
[34일차 Android] Context Menu (1) | 2023.06.17 |
[33일차 Android] Permission (0) | 2023.06.17 |
[32일차 Android] RecyclerView (0) | 2023.06.16 |
[32일차 Android] Spinner (0) | 2023.06.16 |