[Android Kotlin] ์๋๋ก์ด๋ ์ฝํ๋ฆฐ - ๋ทฐ ๋ฐ์ธ๋ฉ (View Binding)
์๋๋ก์ด๋ ๊ฐ๋ฐ ์ xml ์ฐ๊ฒฐํ๋ findViewById() ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋๋ฐ ์ฝํ๋ฆฐ์ ๋ฐฐ์ฐ๋ฉด์ ์ฝํ๋ฆฐ์์๋ง ์ ๊ณตํ๋ ๋ทฐ ๋ฐ์ธ๋ฉ(View Binding)์ ์๊ฒ ๋์๋ค. ์ฌ๋ฌ๋ชจ๋ก findViewById() ๋ณด๋ค ์ฅ์ ์ด ๋ง์์ ๋ฐฐ์ฐ๊ฒ ๋์๋ค. ์ด์ ๋ทฐ ๋ฐ์ธ๋ฉ์ผ๋ก xml ํ๋ฉด์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
0. ๋ทฐ ๋ฐ์ธ๋ฉ(viewBinding)์ ์ฅ์
- ํ์ ์์ ์ฑ : XML์์ ์ ์๋ ๋ทฐ๋ฅผ ์๋ชป ์ฐธ์กฐํ ์ํ์ด ์ค์ด๋ ๋ค.
- ์ปดํ์ผ ํ์ ์ฒดํฌ : ์ค๋ฅ๋ฅผ ์ปดํ์ผ ํ์์ ์ก์ ์ ์์ด์ ๋ฐํ์ ์ค๋ฅ๊ฐ ์ค์ด๋ ๋ค.
- ์ฝ๋ ๊ฐ์ํ : findViewById()๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ณ , ์ค๋ณต ์ฝ๋๊ฐ ์ค์ด๋ ๋ค.
- null ์์ ์ฑ : Kotlin์์๋ null ์์ ์ฑ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ ์์ ํด์ง๋ค.
1. viewBinding ์ค์
build.gradle(Module :app) ํ์ผ์ viewBinding ์ค์ ์ ์ถ๊ฐ
[Sync Now] ํด๋ฆญํด์ ์ค์ ์ ์ฉ
android {
...
buildFeatures {
viewBinding = true
}
}
2.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">
<TextView
android:id="@+id/textSay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnSay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textSay" />
</androidx.constraintlayout.widget.ConstraintLayout>
3. ๋ ์ด์์ ํ์ผ ๋ฐ์ธ๋ฉ์ผ๋ก ์์ฑ
viewBinding์ด ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋๋ก์ด๋๊ฐ ๋ ์ด์์ ํ์ผ์ ์๋์ผ๋ก ๋ฐ์ธ๋ฉ์ผ๋ก ์์ฑ
๊ทธ ๋ค์ ๋ณ์์ ์ ์ฅ๋ ๋ฐ์ธ๋ฉ์ root ๋ทฐ๋ฅผ setContentView์ ์ ๋ฌํ๋ค.
package kr.co.hanbit.sayhello
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kr.co.hanbit.sayhello.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// inflate(layoutInflater) ๋ชจ๋ Activity์์ ํธ์ถํด์ ์ฌ์ฉํ ์ ์๋ค.
val binding = ActivityMainBinding.inflate(layoutInflater)
// bindung.root๋ฅผ ์
๋ ฅํ๋ฉด ํ๋ฉด ์์ ๋ฒํผ์ ์ฌ์ฉํ ์ ์๋ค.
setContentView(binding.root)
}
}
4. ๋ทฐ์ id ์ ๊ทผํ์ฌ ์ฌ์ฉํ๊ธฐ
๋ฒํผ id์ ๋ฆฌ์คํฐ(Listner)๋ฅผ ์ค์ ํ๋ค.
(๋ฆฌ์ค๋์ ์ญํ ์ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ด๋ถ์ ์ฝ๋๋ฅผ ๋์์ํค๋ ๊ฒ)
package kr.co.hanbit.sayhello
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kr.co.hanbit.sayhello.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// id๊ฐ btnSay์ธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด
// id๊ฐ textSay์ธ textView๊ฐ "Hello Kotlin!!"์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
binding.btnSay.setOnClickListener {
binding.textSay.text = "Hello Kotlin!!"
}
}
}