Kotlin

[android : kotlin] 코틀린 팝업메뉴(PopupMenu) 사용 예제

팝업 메뉴는 고정 된 모달 팝업 창에 항목을 표시한다. 공간이없는 경우 뷰 아래에 팝업 메뉴가 나타나거나 뷰 위에 팝업 메뉴가 나타나며 팝업메뉴 외부를 터치하면 자동으로 닫힌다. PopupMenu에서 주로 사용하는 리스너는 메뉴의 항목을 눌렀을 때 반응하는 OnMenuItemClickListener이다.

팝업 메뉴를 만들어 보자. 

menu 레이아웃을 먼저 추가한다.

왼쪽 Project탭에서 res폴더를 클릭 후 마우스 오른쪽 버튼을 눌러 NEW > Android Resource File 를 클릭한다.

리소스 타입으로 Menu를 선택 후 OK버튼을 클릭한다.

 

 


팔레트에서 Menu Item을 드래그하여 Componet Tree의 menu에 끌어다 놓습니다. 3개를 추가한다.


메뉴의 id값을 지정한다.


[popup_menu.xml] res/menu/폴더가 생성 되고  그 안에 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>

[MainActivity.kt]

package edu.kotlin.study

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.widget.PopupMenu
import kotlinx.android.synthetic.main.activity_main.*

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


        button1.setOnClickListener {
            var popup = PopupMenu(this, textView1)  //팝업메뉴를 띄울 뷰객체를 textView1를 선택했다
            menuInflater.inflate(R.menu.popup_menu, popup.menu)

            var listener = PopupMenuListener()
            popup.setOnMenuItemClickListener(listener)
            popup.show()

            //        popup.setOnMenuItemClickListener { item2 ->
            //            when (item2.itemId) {
            //                R.id.item1 ->
            //                    textView1.text = "click1"
            //                R.id.item2 ->
            //                    textView1.text = "click2"
            //                R.id.item3 ->
            //                    textView1.text = "click3"
            //            }
            //            //람다식에서는 리턴문을 안쓰로 값만 써주면 처리된다.
            //            false
            //        }
            //        popup.show()
        }


    }

    inner class PopupMenuListener : PopupMenu.OnMenuItemClickListener {
        override fun onMenuItemClick(item: MenuItem?): Boolean {
            when (item?.itemId) {
                R.id.item1 ->
                    textView1.text = "click1"
                R.id.item2 ->
                    textView1.text = "click2"
                R.id.item3 ->
                    textView1.text = "click3"
            }
            return false
        }

    }

}

[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="텍스트뷰"
        android:textAppearance="@style/TextAppearance.AppCompat.Display2" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />


</LinearLayout>

[build.gradle(:app)] 

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29

    defaultConfig {
        applicationId "edu.kotlin.study"
        minSdkVersion 22
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.1'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

 

Leave a Reply

error: Content is protected !!