본문 바로가기

안드로이드/부스트코스 안드로이드 기본편

[안드로이드 기본] 클릭 이벤트 붙이는 방법

일단 클릭하면 대표적으로 버튼을 떠올릴 수 있을 것이다.

그리고 우리는 그 버튼을 클릭했을 때 무언가 이벤트를 발생시키고 싶어한다.

 

버튼에 클릭 이벤트를 붙이는 방법에는 어떤것들이 있을까?

방법은 총 3가지로 나눌 수 있으며 아래와 같다.

 

1. 익명 클래스를 사용해서 버튼에 리스너 객체를 설정하는 방법

 

2. 버튼 리스너를 액티비티에서 구현하고 이 리스너를 버튼에 설정하는 방법

 

3. 레이아웃 XML 파일의 Button 속성에 onClick 요소를 추가하는 방법

 

[익명 클래스를 사용해서 버튼에 리스너 객체를 설정하는 방법]

package com.practice.android_basic_booster_course

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private val tagName = MainActivity::class.java.simpleName

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

        //익명 객체를 만들어서 버튼에 클릭 이벤트 주기
        button1.setOnClickListener(object: View.OnClickListener{
            override fun onClick(v: View?) {
                Log.d(tagName, "onClick")
            }
        })
    }
}

자바와 코드가 조금 다를 수 있다.

자바에서는 findViewById를 통해서 버튼 객체를 가져오고 그 버튼에 이벤트를 추가한다.

이때, onCreate안의 로컬 변수로 뷰 객체를 선언했다면 final을 앞에 붙여줘야했다. 그 이유는 익명 클래스는 변하는 값을 취급하지 않기 때문이다. 멤버 변수로 선언하여 버튼 객체를 할당했다면, 문제가 되지않는다.

 

코틀린의 경우 kotlin extension을 사용하기 때문에 button1이라는 뷰 객체 자체를 그냥 위와 같이 선언할 수 있다.

위의 코드를 분석하자면 button1이라는 객체에 setOnClickListener라는 메소드가 있는데, 이 메소드는 View.OnClickListener 인터페이스 객체를 받는 메소드이다. 인터페이스를 객체로 넘길때 구현체 부분이 있어야하므로, 익명객체의 구현체를 만들어서 같이 넘기게 된다.

 

[결과값]

2020-01-15 23:09:14.530 25352-25352/com.practice.android_basic_booster_course D/MainActivity: onClick

익명 클래스를 사용해서 버튼에 리스너 객체를 설정하는 방법 전체 코드 보러가기

 

[버튼 리스너를 액티비티에서 구현하고 이 리스너를 버튼에 설정하는 방법]

package com.practice.android_basic_booster_course

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private val tagName = MainActivity::class.java.simpleName

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

        button1.setOnClickListener(this)
    }

    /**
     * 액티비티에 구현한 클릭 리스너
     */
    override fun onClick(v: View?) {
        Log.d(tagName,"onClick : 액티비티에 구현한 리스너")
    }
}

액티비티 자체에 View.OnClickListener 인터페이스를 구현하고, 그 구현한 부분을 button1.setOnClickListener(this)에 넣어주게 된다. 여기서 this View.OnClickListener 구현 객체를 가리킨다.

 

[결과값]

2020-01-15 23:18:45.659 25480-25480/com.practice.android_basic_booster_course D/MainActivity: onClick : 액티비티에 구현한 리스너

버튼 리스너를 액티비티에서 구현하고 이 리스너를 버튼에 설정하는 방법 전체 코드 보러가기

 

[레이아웃 XML 파일의 Button 속성에 onClick 요소를 추가하는 방법]

package com.practice.android_basic_booster_course

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View

class MainActivity : AppCompatActivity() {

    private val tagName = MainActivity::class.java.simpleName

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

    fun callOnClick(v: View){
        Log.d(tagName,"callOnClick XML 이용하기")
    }
}

클릭메소드로 사용하고자하는 메소드를 임의의 메소드 명으로 구현한다.

그리고 그 임의의 메소드 명으로 만들어진 클릭 메소드를 XML Button 속성 중 onClick에 넣어서 호출하게 하면된다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" 
        android:onClick="callOnClick" />

</androidx.constraintlayout.widget.ConstraintLayout>

android:onClick="callOnClick"이 그 버튼 클릭 역할을 하게된다.

 

[결과값]

2020-01-15 23:36:13.913 25689-25689/com.practice.android_basic_booster_course D/MainActivity: callOnClick XML 이용하기

 

레이아웃 XML 파일의 Button 속성에 onClick 요소를 추가하는 방법 전체 코드 보러가기

 

3가지 방법 중 하나만 사용하는 것이 아닌, 상황에 따라서 3가지 모두 다 많이 사용되는 것 같다. 간략하게 사용되는 메소드의 경우 xml에서 처리하면 코드가 짧아지기때문에 더 좋은 것 같고, 반복적으로 사용되는 이벤트일 경우 익명객체로 만들어서 멤버변수로 갖게 하고 그 변수를 다양한 뷰에 setOnClick()에 넣어주는 방법도 좋은것 같다.