Kotlin

[android : kotlin] 코틀린 OnClickListener() 사용방법(Button 사용법)

OnClickListener() 리스너는 사용자가 버튼을 눌렀을 때 반응하는 이벤트 처리를 하기 위해 사용된다.

코틀린 OnClickListener() 사용방법

OnClickListener()를 사용하는 방법에는 inner class로 생성 후 사용하는 방법과 람다식을 사용하는 방법이 있다.

1. inner class를 사용하여 처리하는 방법

inner class 명으로 ButtonListener 지정 후 View 클래스의 OnClickListener()인터페이스를 상속 받겠다고 선언한다.  on을 타이핑 하면 자동완성 기능으로 리스트로 띄워준다. 참 개발하기 편하다. 원리만 알고 있다면 외워서 코딩할 필요가 없는 세상이 되었다. 코틀린에서는 인터페이스를 상속받기 위해서 콜론(:)을  사용한다. 자바언어의 경우 implements를 사용했다. 자바에서는 클래스 안에서 클래스를 선언하면 자동으로 내부 클래스가 되었다. 그러나 코틀린에서는 내부클래스로 만들기 위해서는 inner 키워드를 사용해서 클래스를 만들어주어야 한다. 

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

        button1.setOnClickListener(ButtonListener())

        //var listener1 = ButtonListener()
        //button1.setOnClickListener(listener1)

        button2.setOnClickListener(ButtonListener2())
        button3.setOnClickListener(ButtonListener2())
    }
    
    inner class ButtonListener : View.OnClickListener {
        override fun onClick(v: View?) {
            text1.text = "1번 버튼 클릭!!"
        }
    }

    inner class ButtonListener2 : View.OnClickListener {
        override fun onClick(v: View?) {
            when (v?.id) {
                R.id.button2 -> text1.text = "2번째 버튼 클릭"
                R.id.button3 -> text1.text = "3번째 버튼 클릭"
                else -> null

            }
        }
    }

코틀린에서 when문은 자바에서 switch()문과 같다. 자바에서 case : 대신에 -> 를 사용하여 표현된다. 자바의 default 키워드는 else로 표현된다.

2. 람다식을 사용하는 방법

코틀린 언어가 업데이트 되면서 view -> 마져 코드 작성에서 제외해도 문제가 되지않는다.

button4.setOnClickListener { view -> text1.text = "4번째 버튼 클릭" }
        
button4.setOnClickListener { text1.text = "4번째 버튼 클릭" }

//둘 다 동일한 처리를 해준다.

[MainActivity.kt]

package edu.kotlin.study

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
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(ButtonListener())

        //var listener1 = ButtonListener()
        //button1.setOnClickListener(listener1)

        button2.setOnClickListener(ButtonListener2())
        button3.setOnClickListener(ButtonListener2())

        //button4.setOnClickListener { view -> text1.text = "4번째 버튼 클릭" }

        button4.setOnClickListener { text1.text = "4번째 버튼 클릭" }
    }

    inner class ButtonListener : View.OnClickListener {
        override fun onClick(v: View?) {
            text1.text = "1번 버튼 클릭!!"
        }
    }

    inner class ButtonListener2 : View.OnClickListener {
        override fun onClick(v: View?) {
            when (v?.id) {
                R.id.button2 -> text1.text = "2번째 버튼 클릭"
                R.id.button3 -> text1.text = "3번째 버튼 클릭"
                else -> null

            }
        }
    }
}

ButtonListener2()클래스에서 오버라이드해서 만든 메소드가(fun) 절에 onClick의 변수로 받는 View를 보면 ?처리를 하였다. 이는 널 값이 넘어올 수 도 있음을 뜻함으로 when()절에서 받을 때 반드시 ?로 처리를 동일하게 해주어야 오류가 발생하지 않는다. v?.id가 올바른 처리법이다. 물음표를 넣어주지않으면 오류가 난다.

[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/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Hello World!"
        android:textAppearance="@style/TextAppearance.AppCompat.Display4" />

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

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

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

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


</LinearLayout>

Leave a Reply

error: Content is protected !!