Kotlin

[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

작업 뷰 및 작업 제공자 사용하기 – Android Developer

 

Leave a Reply

error: Content is protected !!