일단 클릭하면 대표적으로 버튼을 떠올릴 수 있을 것이다.
그리고 우리는 그 버튼을 클릭했을 때 무언가 이벤트를 발생시키고 싶어한다.
버튼에 클릭 이벤트를 붙이는 방법에는 어떤것들이 있을까?
방법은 총 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()에 넣어주는 방법도 좋은것 같다.
'안드로이드 > 부스트코스 안드로이드 기본편' 카테고리의 다른 글
[안드로이드 기본] 기본 다이얼로그 띄우기 (0) | 2020.01.29 |
---|---|
[안드로이드 기본] 터치 이벤트 순서 알아보기 (0) | 2020.01.16 |
[안드로이드 기본] 액티비티와 주요 구성 요소 (0) | 2020.01.13 |
[안드로이드 기본] 셀렉터 속성 정리하기 (0) | 2020.01.05 |
[안드로이드 기본] 안드로이드 로그 남기기 (0) | 2020.01.05 |