[android : kotlin] 코틀린 옵션메뉴( Option Menu )사용 예제( onCreateOptionsMenu, onOptionsItemSelected)
옵션메뉴(Option Menu)뷰를 사용해보자. 옵션 메뉴는 액션바(툴바)에 포함되는 메뉴를 의미한다. onCreateOptionsMenu() 메서드를 사용하여 메뉴를 생성한다. 메뉴를 클릭했을 때의 이벤트 처리는 onOptionsItemSelected() 메서드를 오버라이드 하여 처리한다. Option Menu를 생성하는 방법에는 2가지가 있다. 메뉴 xml을 이용해서 만드는 방법과 프로그래밍 방식(programmatically)으로 만드는 방법이다. 이 두가지를 모두 살펴보도록 하자
menu 레이아웃을 먼저 만들어 보자.
왼쪽 Project탭에서 res폴더를 클릭 후 마우스 오른쪽 버튼을 눌러 NEW > Android Resource File 를 클릭한다.
레이아웃이름(File name)으로 option_menu 로 타이핑하였다. 레이아웃 이름으로 대문자는 사용할 수 없다.
리소스 타입으로 Menu를 선택 후 OK버튼을 클릭한다.
팔레트에서 Menu Item을 드래그하여 Componet Tree의 menu에 끌어다 놓는다. 3개를 추가한다.
메뉴안에 하위 메뉴를 추가하고자 할 경우 팔래트(palette)에서 Menu를 추가 후에 Menu Item를 추가해주면 된다.
메뉴의 id값을 지정한다.
[option_menu.xml] res/menu/폴더가 생성 되고 그 안에 option_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" >
<menu >
<item
android:id="@+id/item1_1"
android:title="Item 1-1" />
<item
android:id="@+id/item1_2"
android:title="Item 1-2" />
</menu>
</item>
<item
android:id="@+id/item2"
android:title="Item2" />
<item
android:id="@+id/item3"
android:title="Item3" />
</menu>
■ 프로그래밍 방식으로 메뉴를 추가 하는 방법
onCreateOptionsMenu()메서드를 오버라이드 하여 처리한다. 하위메뉴는 addSubMenu()메서드를 사용하여 처리한다.
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.option_menu, menu)
//코드로 메뉴 추가하기
menu?.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "PROGRAMMATIC MENU1")
menu?.add(Menu.NONE, Menu.FIRST + 2, Menu.NONE, "PROGRAMMATIC MENU2")
var sub: Menu? = menu?.addSubMenu("PROGRAMMATIC MENU3")
sub?.add(Menu.NONE, Menu.FIRST + 3, Menu.NONE, "PROGRAMMATIC MENU 3-1")
sub?.add(Menu.NONE, Menu.FIRST + 4, Menu.NONE, "PROGRAMMATIC MENU 3-2")
return super.onCreateOptionsMenu(menu)
//return false 처리시 메뉴 감춤효과 가능
}
[MainActivity.kt]
package edu.kotlin.study
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.option_menu, menu)
//코드로 메뉴 추가하기
menu?.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "PROGRAMMATIC MENU1")
menu?.add(Menu.NONE, Menu.FIRST + 2, Menu.NONE, "PROGRAMMATIC MENU2")
var sub: Menu? = menu?.addSubMenu("PROGRAMMATIC MENU3")
sub?.add(Menu.NONE, Menu.FIRST + 3, Menu.NONE, "PROGRAMMATIC MENU 3-1")
sub?.add(Menu.NONE, Menu.FIRST + 4, Menu.NONE, "PROGRAMMATIC MENU 3-2")
return super.onCreateOptionsMenu(menu)
//return false 처리시 메뉴 감춤효과 가능
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
// R.id.item1 ->
// textView1.text = "메뉴1 클릭"
R.id.item1_1 ->
textView1.text = "메뉴1-1 클릭"
R.id.item1_2 ->
textView1.text = "메뉴1-2 클릭"
R.id.item2 ->
textView1.text = "메뉴2 클릭"
// R.id.item3 ->
// textView1.text = "메뉴3 클릭"
Menu.FIRST + 1 -> textView1.text = "P MENU1 클릭"
Menu.FIRST + 2 -> textView1.text = "P MENU2 클릭"
Menu.FIRST + 3 -> textView1.text = "P MENU 3-1 클릭"
Menu.FIRST + 4 -> textView1.text = "P MENU 3-2 클릭"
}
return super.onOptionsItemSelected(item)
}
}
[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'
}