안드로이드

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

행복하개! 2020. 3. 26. 22:23

Pop Up 메뉴 역시 앞서 보았던 Option Context와 거의 동일하다.

 

popup_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/Item1"
        android:title="Item1" />
    <item
        android:id="@+id/Item2"
        android:title="Item2" />
    <item
        android:id="@+id/Item3"
        android:title="Item3" />
</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/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        style="@style/TextAppearance.AppCompat.Large"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="팝업메뉴" />

</LinearLayout>

 

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            var pop = PopupMenu(this, tv1)

            menuInflater.inflate(R.menu.popup_menu, pop.menu)

            // 1. 리스너로 처리
            var listener = PopupListener()
            pop.setOnMenuItemClickListener(listener)

            // 2. 람다식으로 처리
            pop.setOnMenuItemClickListener { item ->
                when (item.itemId) {
                    R.id.Item1 ->
                        tv1.text = "1"
                    R.id.Item2 ->
                        tv1.text = "2"
                }
                false
            }
            pop.show()
        }
    }

    // 1. 리스너로 처리
    inner class PopupListener : PopupMenu.OnMenuItemClickListener {
        override fun onMenuItemClick(p0: MenuItem?): Boolean {
            when (p0?.itemId) {
                R.id.Item1 ->
                    tv1.text = "menu1"
                R.id.Item2 ->
                    tv1.text = "menu1"
            }
            return false
        }

    }
}

 

 

 

 

키워드라 한다면 PopupMenu.OnMenuItemClickListener 인터페이스를 상속시켜서 사용해야 된다는 점이다. 오버라이딩 메서드가 한 개라서 람다식으로도 가능하다.