[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'
}