
이벤트 리스너란?
View클래스 내에 있는 일종의 인터페이스로, 하나의 콜백 메서드를 가지고 있습니다. 이러한 콜백 메서드는 리스너가 등록된 뷰에서 상호작용이 일어났을 시 Android 프레임워크에 의해 호출됩니다. OnClickListener는 View를 상속하고 있는 개별 UI 구성요소(위젯)들이 클릭 됐을 때 작동하는 인터페이스입니다.
방법은 총 3가지 입니다.
1. View.OnClickListener을 implement
2. OnClickListener의 객체 생성
3. 버튼 xml 코드에 직접 할당
1. View.OnClickListener을 implement
class MainActivity : AppCompatActivity(), View.OnClickListener{
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textButton.setOnClickListener(this)
}
override fun onClick(v: View) {
when(v.id){
binding.textButton.id -> Toast.makeText(this, "버튼이 클릭됬습니다", Toast.LENGTH_SHORT).show()
}
}
}
onClick함수를 override 해서 OnClickListener에 set 해주는 방식입니다.
설정해야 하는 리스너가 많을 경우(2 ~ 3개 이상) 효과적으로 사용할 수 있습니다.
2. View.OnClickListener 객체를 만들어서 할당
객체는 익명 객체와 일반 객체 2가지가 있습니다.
- 익명 객체
class MainActivity : AppCompatActivity(){
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textButton.setOnClickListener(View.OnClickListener {
Toast.makeText(this, "버튼이 클릭됬습니다", Toast.LENGTH_SHORT).show()
})
binding.textButton.setOnClickListener{
Toast.makeText(this, "버튼이 클릭됬습니다", Toast.LENGTH_SHORT).show()
}
}
}
설정해야 하는 리스너가 적은 경우 사용하는 방법입니다.
자바 방식대로 익명 객체를 생성할 수도 있고 람다로도 생성할 수 있습니다.
- 일반 객체
class MainActivity : AppCompatActivity(){
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textButton.setOnClickListener(TestClass(this))
}
}
class TestClass(private val context: Context): View.OnClickListener{
override fun onClick(v: View) {
Toast.makeText(context, "버튼이 클릭됬습니다", Toast.LENGTH_SHORT).show()
}
}
별도의 클래스 생성 후 객체를 생성하는 방식입니다. 클릭 리스너를 재활용할 수 있는 장점이 있습니다.
3. xml에서 버튼의 onClick 프로퍼티에 할당
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.button.MaterialButton
android:id="@+id/text_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="clickEvent1"
android:text="testbutton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity(){
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
fun clickEvent1(view: View){
Toast.makeText(this, "버튼을 클릭했습니다", Toast.LENGTH_SHORT).show()
}
}
xml의 버튼에 MainActivity에서 만든 함수를 할당해줍니다. 보기도 불편하고 결합도도 높아서 잘 사용하지 않는 방식입니다.

마치며
클릭 이벤트를 할당하는 3가지 방법을 알아봤습니다. 보통 익명객체와 View.OnClickListener을 implement 하는 방법을 많이 사용하고 xml에 직접 할당하는 것은 레이아웃과 코드의 결합도가 높아서 잘 사용하지 않습니다.
'안드로이드 > Activity & Fragment' 카테고리의 다른 글
Navigation의 백스택을 관리해보자 (0) | 2023.04.26 |
---|---|
Navigation으로 Fragment전환을 쉽게 해보자 (feat.BottomNavigation) (0) | 2023.03.30 |
Activity to Fragment, Fragment to Fragment (0) | 2022.06.13 |