π κ°λ° νκ²½
βͺ IDE : Android Studio Koala 2024.1.1
βͺ JAVA : 17.0.10
1. μ΄λ²€νΈ 리μ€λ (Event Listener)
μ΄λ²€νΈ 리μ€λλ μ¬μ©μ μ λ ₯(ν΄λ¦, ν°μΉ λ±)μ΄λ μμ€ν μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ μΈν°νμ΄μ€μ΄λ€. νΉμ μ΄λ²€νΈκ° λ°μνμ λ μ΄λ€ λμμ μνν μ§ μ μνλ μν μ νλ€. μ΄λ²€νΈ 리μ€λλ μ¬λ¬ λ·°(View)μμ 곡μ λ μ μλ€.
2. μμ£Ό μ¬μ©νλ 4κ°μ§ μ΄λ²€νΈ 리μ€λ
1) onClick() : μ¬μ©μκ° μ΄λ€ νλͺ©μ ν°μΉνμ λ
2) onLongClick() : ν°μΉνκ³ μΌμ μκ° λμ λλ₯΄κ³ μμ λ
3) onFocusChange() : ν¬μ»€μ€κ° μ΄λλ λ
4) onKey() : ν¬μ»€μ€ μμμ ν€λ₯Ό λλ₯΄κ³ λμ λ
3. μ΄λ²€νΈ μ²λ¦¬ κ³Όμ
μ΄λ²€νΈ λ°μ -> 리μ€λ νΈμΆ -> λ‘μ§ μ€ν
4. μ΄λ²€νΈ 리μ€λ λ±λ‘ λ°©λ²
1) XMLμμ μ΄λ²€νΈ 리μ€λ λ±λ‘
XML λ μ΄μμ νμΌμμ λ·°μ μ§μ μ΄λ²€νΈ 리μ€λλ₯Ό λ±λ‘ν μ μλ€.
μ₯μ : κ°λ¨νκ³ μ§κ΄μ μ΄λ€. λ μ΄μμκ³Ό λ‘μ§μ΄ λΆλ¦¬λμ΄ κ°λ μ±μ΄ μ’λ€.
λ¨μ : 리ν©ν λ§μ΄ μ΄λ ΅λ€. λ©μλ μ΄λ¦μ΄ λ³κ²½λκ±°λ λ²νΌ IDκ° λ³κ²½λ κ²½μ° XMLκ³Ό μ½λλ₯Ό λͺ¨λ μμ ν΄μΌ νλ€. λκ·λͺ¨ νλ‘μ νΈμμ λ§μ λ²νΌκ³Ό λ©μλλ₯Ό κ΄λ¦¬ν λ, XMLκ³Ό Java/Kotlin μ½λ κ°μ μ°κ²°μ΄ 볡μ‘ν΄μ§κ³ , μ μ§λ³΄μκ° μ΄λ ΅λ€.
π activity_main.xml
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="myEvent"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
π MainActivity.kt
package com.example.event_test
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
// XMLμμ λ·°μ 미리 μ΄λ²€νΈλ₯Ό λ±λ‘ν κ²
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
// myEvent λ©μλλ XML λ μ΄μμ νμΌμμ λ²νΌμ onClick μμ±μ μ°κ²°λ λ©μλ
fun myEvent(view: View) {
// λ²νΌ ν΄λ¦ μ μ²λ¦¬ν λ‘μ§
Toast.makeText(applicationContext, "λ²νΌ ν΄λ¦λ¨", Toast.LENGTH_SHORT).show()
}
}
2) ν΄λμ€μμ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ΄λ²€νΈ 리μ€λ λ±λ‘
MainActivity ν΄λμ€μ View.OnClickListener μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ λ¦¬μ€λλ₯Ό μ°κ²°ν μ μλ€.
* onClick λ©μλ λ΄μμ λͺ¨λ λ·°μ μ΄λ²€νΈλ₯Ό κ΄λ¦¬νλ―λ‘ μ’μ§ μλ€κ³ μκ°νλ€.
μ₯μ : μ΄λ²€νΈ μ²λ¦¬λ₯Ό νλμ λ©μλμμ κ΄λ¦¬ν μ μμ΄ μ΄λ²€νΈλ₯Ό ν κ³³μμ μ²λ¦¬νκΈ° μ©μ΄νλ€.
λ¨μ : μ¬λ¬ λ·°μ μ΄λ²€νΈλ₯Ό ν κ³³μμ μ²λ¦¬νλ©΄ λ©μλκ° κΈΈμ΄μ§κ³ κ°λ μ±μ΄ λ¨μ΄μ§ μ μλ€.
π activity_main.xml
<?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:id="@+id/main"
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:layout_marginTop="275dp"
android:text="Button1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="Button2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button1" />
</androidx.constraintlayout.widget.ConstraintLayout>
π MainActivity.kt
package com.example.ex_event
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
// MainActivity ν΄λμ€λ View.OnClickListenerλ₯Ό ꡬν
class MainActivity : AppCompatActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// XML λ μ΄μμ νμΌμμ λ²νΌμ μ°Ύμ λ³μμ ν λΉ
val button1: Button = findViewById(R.id.button1)
val button2: Button = findViewById(R.id.button2)
// λ²νΌμ ν΄λ¦ 리μ€λ λ±λ‘
button1.setOnClickListener(this)
button2.setOnClickListener(this)
}
// onClick λ©μλλ λ²νΌ ν΄λ¦ μ νΈμΆλ¨
override fun onClick(view: View) {
// ν΄λ¦λ λ·°μ idμ λ°λΌ λ€λ₯΄κ² μ²λ¦¬
when (view.id) {
// λ²νΌ ν΄λ¦ μ μ²λ¦¬ν λ‘μ§
R.id.button1 -> Toast.makeText(applicationContext, "λ²νΌ 1 ν΄λ¦λ¨", Toast.LENGTH_SHORT).show()
R.id.button2 -> Toast.makeText(applicationContext, "λ²νΌ 2 ν΄λ¦λ¨", Toast.LENGTH_SHORT).show()
}
}
}
3) μ΅λͺ ν΄λμ€μ λλ€ ννμμ μ¬μ©νμ¬ μ΄λ²€νΈ 리μ€λ λ±λ‘
μ΅λͺ ν΄λμ€μ λλ€ ννμμ μ¬μ©νμ¬ μ΄λ²€νΈλ₯Ό λ±λ‘ν μ μλ€. λ¨, λλ€ ννμμ Java 8 μ΄μμμ μ¬μ©ν μ μλ€.
μ₯μ : μ½λκ° λ§€μ° κ°κ²°νλ€. νμν λλ§λ€ 리μ€λλ₯Ό μ μν μ μμ΄ μ½λκ° λΆλ¦¬λκ³ κ΄λ¦¬νκΈ° μ½λ€.
λ¨μ : μ΅λͺ ν΄λμ€λ₯Ό κ³Όλνκ² μ¬μ©ν κ²½μ° μ½λκ° λ³΅μ‘ν΄μ§ μ μλ€. λλ€ ννμμ Java 8 μ΄μμμλ§ μ¬μ© κ°λ₯νλ€.
π activity_main.xml
<?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:id="@+id/main"
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:layout_marginTop="275dp"
android:text="Button1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="Button2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button1" />
</androidx.constraintlayout.widget.ConstraintLayout>
π MainActivity.kt
package com.example.ex_event
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// XML λ μ΄μμ νμΌμμ λ²νΌμ μ°Ύμ λ³μμ ν λΉ
val button1: Button = findViewById(R.id.button1)
val button2: Button = findViewById(R.id.button2)
// μ΅λͺ
ν΄λμ€λ₯Ό μ¬μ©νμ¬ ν΄λ¦ 리μ€λ μ€μ
button1.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View?) {
// λ²νΌ ν΄λ¦ μ μ²λ¦¬ν λ‘μ§
Toast.makeText(applicationContext, "λ²νΌ 1 ν΄λ¦λ¨", Toast.LENGTH_SHORT).show()
}
})
// λλ€ ννμμ μ¬μ©νμ¬ ν΄λ¦ 리μ€λ μ€μ
button2.setOnClickListener {
// λ²νΌ ν΄λ¦ μ μ²λ¦¬ν λ‘μ§
Toast.makeText(applicationContext, "λ²νΌ 2 ν΄λ¦λ¨", Toast.LENGTH_SHORT).show()
}
}
}
* μ΅λͺ ν΄λμ€μμλ View κ°μ²΄κ° nullμΌ κ°λ₯μ±μ μ²λ¦¬νκΈ° μν΄ view: View?λ₯Ό μ¬μ©νλ€. λλ€ ννμμμλ View κ°μ²΄κ° nullμ΄ λ κ°λ₯μ±μ΄ μλ€κ³ κ°μ νκΈ° λλ¬Έμ view: Viewλ₯Ό μ¬μ©νλ€. μ΄λ¬ν μ°¨μ΄μ μ λλ€ ννμμ κ°κ²°ν¨κ³ΌView.OnClickListener μΈν°νμ΄μ€μ λμ λ°©μμμ λΉλ‘―λλ€.
XMLμμ μ΄λ²€νΈ 리μ€λλ₯Ό λ±λ‘νλ λ°©λ²μ κ°λ¨νκ³ μ§κ΄μ μ΄μ§λ§ μ μ°μ±μ΄ λ¨μ΄μ§λ©°, MainActivity ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ¬μ©νλ λ°©λ²μ ν κ³³μμ κ΄λ¦¬κ° κ°λ₯νμ§λ§ κ°λ μ±μ΄ λ¨μ΄μ§ μ μμ΅λλ€. μ΅λͺ ν΄λμ€μ λλ€ ννμμ μ¬μ©νλ λ°©λ²μ μ½λκ° κ°κ²°ν΄μ§κ³ μ μ°μ±μ΄ λλ€. μ΄λ° μ μ λ³Ό λ, κ°μ₯ μ¬μ©νκΈ° νΈν κ²μ λλ€ ννμμ΄λΌκ³ μκ°νλ€.
'IDE > AndroidStudio' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλλ‘μ΄λ λ·° λ°μΈλ© (Android View Binding) (0) | 2024.07.12 |
---|
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!