๐คAndroid/Kotlin
[Android Kotlin] ์๋๋ก์ด๋ ์ฝํ๋ฆฐ - ๋ทฐ ๋ฐ์ธ๋ฉ(View Binding)
๋ฃจ๋ฆฌ์ผใ
2024. 10. 18. 16:05
๋ฐ์ํ
๋ด๊ฐ ์๊ฐํ๋ ๋ทฐ๋ฐ์ธ๋ฉ์ ์ฅ์ ์
๋งค๋ฒ findViewById๋ฅผ ์ฐ์ง ์์๋ ๋๋ ์ ์ด๋ค.
๊ทธ ์ธ์ ์๋ชป๋ ID ์ ๊ทผ์ด๋ ํ๋ณํ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ์์ ์์ ๋ฐ๊ฒฌํ ์ ์๊ณ , MVVMํจํด๊ณผ ์ ์ด์ธ๋ฆฌ๋ฉฐ XML์ ๋ฐ์ดํฐ์ ๋ก์ง์ ์ฐ๊ฒฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
1. build.gradle.kts(Module: app)
android {
...
dataBinding {
enable = true
}
}
์์ฑ ํ Sync Now
2. IntroActivity
layout ํ๊ทธ๋ก ์ ์ฒด ๊ฐ์ธ๊ธฐ
<layout>
<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=".auth.IntroActivity">
...
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
3. Activity์ ๋ทฐ๋ฐ์ธ๋ฉ ์์ฑ
class IntroActivity : AppCompatActivity() {
// 1. ๋ฐ์ธ๋ฉ ์์ฑ
// ActivityIntroBinding์ activity_intro.xml ํ์ผ๊ณผ ์ฐ๊ฒฐ๋ ์๋ ์์ฑ๋ ๋ฐ์ธ๋ฉ ํด๋์ค
// lateinit var๋ฅผ ์ฌ์ฉํด ๋์ค์ ๋ฐ์ธ๋ฉ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ์ ์๋๋ก ์ค์
private lateinit var binding: ActivityIntroBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
// 2. DataBindingUtil๋ก ๋ ์ด์์์ ๋ฐ์ธ๋ฉ
// DataBindingUtil.setContentView๋ ๋ ์ด์์ ํ์ผ(activity_intro.xml)์ ์ธํ๋ ์ดํธํ๊ณ ,
// ํด๋น ๋ ์ด์์๊ณผ ์ฐ๊ฒฐ๋ ๋ฐ์ธ๋ฉ ๊ฐ์ฒด(ActivityIntroBinding)๋ฅผ ์์ฑ
// ์ด ๋ฐ์ธ๋ฉ ๊ฐ์ฒด๋ฅผ ํตํด XML์์ ์ ์ํ UI ์์์ ์ง์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
binding = DataBindingUtil.setContentView(this, R.layout.activity_intro)
// 3. UI ์์์ ์ ๊ทผํ์ฌ ํด๋ฆญ ๋ฆฌ์ค๋ ์ค์
// ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด XML์ ์ ์๋ ๋ทฐ ์์๋ค์ ์ง์ ์ ๊ทผํ ์ ์.
// ํด๋ฆญ ์ด๋ฒคํธ ๋ฐ์ ์ LoginActivity๋ก ํ๋ฉด ์ ํ
binding.loginBtn.setOnClickListener {
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
}
// joinBtn ํด๋ฆญ ์ JoinActivity๋ก ํ๋ฉด ์ ํ
binding.joinBtn.setOnClickListener {
val intent = Intent(this, JoinActivity::class.java)
startActivity(intent)
}
}
}
๋ฐ์ํ