[android : kotlin] 코틀린 액션바( ActionBar )사용 예제( showAsAction, onOptionsItemSelected)
액션바(ActionBar)를 사용해보자. 액션바는 안드로이드 화면 상단에 배치되는 바이다. 액션바를 이용하여 옵션 메뉴(Option Menu)의 항목을 아이콘 등으로 표시할 수 있다. 액션바는 옵션 메뉴(Option Menu)를 사용하는 방법과 동일하다. 메뉴 속성으로 Icon, showAsAction, actionViewClass 등의 속성을 지정한다. showAsAction은 액션바에 배치여부를 설정한다. actionViewClass는 액션바를 접었다 폈다.할 때 호출할 뷰를 설정한다. onCreateOptionsMenu() 메서드를 사용하여 메뉴를 생성한다. 메뉴를 클릭했을 때의 이벤트 처리는 onOptionsItemSelected() 메서드를 오버라이드 하여 처리한다.
■showAsAction의 속성 값
never | 액션바에 표시 안함 |
always | 액션바에 항상 표시 |
ifRoom | 액션바 공간이 존재한다면 표시 ( 안드로이드 휴대폰의 화면 해상도에 따라 액션바의 공간(width)은 달라진다.) |
withText | 아이콘과 함께 text도 함께 표시 |
collapseActionView | 접었다. 폈다 하면서 뷰를 표시 |
menu 레이아웃을 먼저 만들어 보자.
왼쪽 Project탭에서 res폴더를 클릭 후 마우스 오른쪽 버튼을 눌러 NEW > Android Resource File 를 클릭한다.
레이아웃이름(File name)으로 actionbar_menu로 타이핑하였다. 레이아웃 이름으로 대문자는 사용할 수 없다.
리소스 타입으로 Menu를 선택 후 OK버튼을 클릭한다.
팔레트에서 Menu Item을 드래그하여 Componet Tree의 menu에 끌어다 놓는다. 5개를 추가한다. 메뉴의 id값을 지정한다. showAsAction 속성에서 5가지 중 중복 선택이 가능하다.
[actionbar_menu.xml] res/menu/폴더가 생성 되고 그 안에 actionbar_menu.xml 파일이 생성된다
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/Item1"
android:icon="@android:drawable/ic_menu_search"
android:title="Item1"
app:showAsAction="always|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"/>
<item
android:id="@+id/Item2"
android:title="Item2" />
<item
android:id="@+id/Item3"
android:icon="@android:drawable/btn_star_big_on"
android:title="Item3"
app:showAsAction="always" />
<item
android:id="@+id/Item4"
android:icon="@android:drawable/ic_dialog_info"
android:title="Item4"
app:showAsAction="always|withText" />
<item
android:id="@+id/Item5"
android:icon="@android:drawable/ic_lock_idle_alarm"
android:title="Item5"
app:showAsAction="ifRoom" />
</menu>
[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 androidx.appcompat.widget.SearchView
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//액션바 타이틀 없애기
//supportActionBar?.setDisplayShowTitleEnabled(false)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.actionbar_menu, menu)
//검색바를 컨트롤해보자
var searchItem: MenuItem? = menu?.findItem(R.id.Item1)
var searchView: SearchView = searchItem?.actionView as SearchView
searchView.queryHint = "검색어 입력."
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
// 입력 완료 되었을 때만 반응
override fun onQueryTextSubmit(query: String?): Boolean {
textView2.text = query
//return true 키보드가 유지
return false // 키보드 감춤
}
// 입력할때마다 반응
override fun onQueryTextChange(newText: String?): Boolean {
textView1.text = newText
return false
}
})
return super.onCreateOptionsMenu(menu)
//return false 처리시 메뉴 감춤효과 가능
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.Item1 ->
textView1.text = "메뉴1 클릭"
R.id.Item2 ->
textView1.text = "메뉴2 클릭"
R.id.Item3 ->
textView1.text = "메뉴3 클릭"
R.id.Item4 ->
textView1.text = "메뉴4 클릭"
R.id.Item5 ->
textView1.text = "메뉴5 클릭"
}
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" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="텍스트뷰2"
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'
}
[REFERENCE]
작업 뷰 및 작업 제공자 사용하기 – Android Developer