Option Menu를 생성하는 방법에는 2가지가 있다. 하나는 xml을 이용해서 만드는 방법, 그리고 나머지는 코드를 이용해서 만드는 방법이다. 이 두가지를 모두 살펴보도록 하자
먼저 xml을 만들어야한다. 이 xml을 만들기 위해서는 res폴더에 만드는데 그 절차는 다음과 같다.
res 폴더 우클릭 -> new -> Android Resource File (values-> menu)
이름은 option_menu.xml 으로 하자. 참고로 대문자로 쓰면 안된다!
option_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/item1"
android:title="item1" />
<item
android:id="@+id/item2"
android:title="menu2" >
<menu>
<item
android:id="@+id/Item2_1"
android:title="Item2_1" />
<item
android:id="@+id/Item2_2"
android:title="Item2_2" />
</menu>
</item>
<item
android:id="@+id/item3"
android:title="item3"></item>
</menu>
두번 째 메뉴를 보면 메뉴안에 메뉴가 또 있는 것을 볼 수 있다. 안드로이드에서는 메뉴안에 메뉴(이하 메뉴 아이템 포함) 을 넣는 것이 가능하다. 이 메뉴를 앱바에 붙이기 위해서는 아래의 코드에 작성해야 한다.
MainActivity.xml
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
// 1. xml을 이용한 메뉴 만들기
menuInflater.inflate(R.menu.option_menu, menu)
// 2. 코드를 이용한 메뉴 만들기
menu?.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "코드메뉴1")
menu?.add(Menu.NONE, Menu.FIRST + 2, Menu.NONE, "코드메뉴2")
var sub: Menu? = menu?.addSubMenu("메뉴3")
sub?.add(Menu.NONE, Menu.FIRST + 3, Menu.NONE, "코드메뉴3-1")
sub?.add(Menu.NONE, Menu.FIRST + 4, Menu.NONE, "코드메뉴3-2")
// true로 해야 메뉴가 나타난다.
return true
// false는 안나옴
return false
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// 1. xml을 이용한 메뉴 만들기
when (item?.itemId) {
R.id.item1
-> tv1.text = "1"
R.id.Item2_1
-> tv1.text = "2-1"
R.id.Item2_2
-> tv1.text = "2-2"
R.id.item3
-> tv1.text = "3"
}
// 2. 코드를 이용한 메뉴 만들기
when (item?.itemId) {
Menu.FIRST + 1
-> tv1.text = "1"
Menu.FIRST + 2
-> tv1.text = "2"
Menu.FIRST + 3
-> tv1.text = "3-1"
Menu.FIRST + 4
-> tv1.text = "3-2"
}
return super.onOptionsItemSelected(item)
}
}
onCreateOptionsMenu를 오버라이딩 하고, menuInflater을 통해서 option_menu.xml을 붙이고, 두번째 인자로 menu를 주면 메뉴를 붙일 수 있다.
의도한대로 menu2에는 서브 item이 붙는다.
그리고 해당 아이템 터치에 따른 이벤트를 위해서는 onOptionsItemSelected라는 메서드를 오버라이딩하여 사용한다. 주의 해야 할 점은 서브메뉴라고 해서 메뉴안에 서브메뉴 .. 이런식으로 구분하지 않는다. 그저 id로 만 구분하기 때문에 아이디는 무조건 다 다른 아이디로 지어줘야한다. when 절을 통해서 해당 아이디일 때, 분기를 실행한다.
코드를 통해서 메뉴를 삽일 할때는 menu의 add 를 이용하는데, 두 번째 인자가 아이디에 해당한다. 코드와 같이 서브메뉴를 addSubMenu를 통해서 붙인다. onOptionsItemSelected에서도 동일하게 when절을 사용해서 만드는데, 두 번째 인자에 넣었던 값을 아이디로 활용해서 분기를 컨트롤하면 된다.
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"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
style="@style/TextAppearance.AppCompat.Large"/>
</LinearLayout>
'안드로이드' 카테고리의 다른 글
[Android Kotlin] 안드로이드 코틀린 Pop Up Menu (0) | 2020.03.26 |
---|---|
[Android Kotlin] 안드로이드 코틀린 Context Menu (0) | 2020.03.26 |
[Android Kotlin] 안드로이드 코틀린 ViewPager (0) | 2020.03.24 |
[Android Kotlin] 안드로이드 코틀린 Spinner (0) | 2020.03.24 |
[Android Kotlin] 안드로이드 코틀린 Custom Adapter (0) | 2020.03.24 |