안드로이드

[Android Kotlin] 안드로이드 코틀린 Option Menu

행복하개! 2020. 3. 26. 21:55

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를 주면 메뉴를 붙일 수 있다. 

 

1. 버튼을 클릭했을 때
2. menu2를 터치 했을 때

의도한대로 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>