
๊ธฐ์กด์๋ XMLํ์ผ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ findViewById๋ก ์ฐพ์์์ต๋๋ค.
findViewById ์์
๋ฒํผ์ ์์ฑํ๊ณ ๋ฒํผ์ text๋ฅผ ๋ฃ๋๋ค๊ณ ํ๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง์ผํฉ๋๋ค.
๋ง์ฝ ๋ฒํผ์ด 100๊ฐ๋ผ๋ฉด findViewById๋ฅผ ํตํด 100๊ฐ์ ๋ฒํผ์ ๊ฐ์ฒด๋ก ์์ฑํด์ค์ผํฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด
- ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
- ์ผ์ผ์ด ์ง์ ์ ๋ ฅํด์ผ๋๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ ค ์์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ๋ง์ฝ ๋ฒํผ์ด 100๊ฐ๋ผ๋ฉด? findViewById -> 100๊ฐ
val button1 : Button = findViewById(R.id.button1)
val button2 : Button = findViewById(R.id.button2)
val button3 : Button = findViewById(R.id.button3)
button1.text = "abcd"
button2.text = "abcd"
button3.text = "abcd"
}
}
์ผ์ผ์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ๊ณผ ์์ฐ์ฑ์ด ๋จ์ด์ง๋๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด Kotlin-Android-Extension์ด ๋ฑ์ฅํ์ต๋๋ค.
Kotlin-Android-Extension ๋ฑ์ฅ
Kotlin-Android-Extension์ KTX๋ผ๊ณ ๋ํฉ๋๋ค.
์ฌ์ค โkotlin-android-extensionsโ์ ์ข์ ํ๋ฌ๊ทธ์ธ์ ์๋๋๋ค.
findViewById์ ๋ฐ๋ณต์ ์ธ ์์ ์ ์ ๊ฑฐํ๋ ค๊ณ ๋ง๋ค์ด์ก๊ณ , ๋ด๋ถ์ ์ธ ์บ์๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ์ ๋์์ ๋ฟ์ ๋๋ค.
KTX ์ธํ ๋ฐฉ๋ฒ
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
// KTX๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ์ ์ธ
id 'kotlin-android-extensions'
}
MainActivity.kt
KTX๋ฅผ ์ฌ์ฉํ๋ฉด
activity_main.xml์์ Button ์ปดํฌ๋ํธ์ ๋ถ์ฌํด์ค Id๋ฅผ ๋ฐ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// KTX
button1.text = "abcd"
button2.text = "abcd"
button3.text = "abcd"
}
}
deprecated๋ ์ด์
์๋์ ๊ฐ์ด ๋ช ๊ฐ์ง ์ฑ๋ฅ์ ์ธ ์ด์๊ฐ ์์ต๋๋ค.
์๋ฌ ๋ฐ์ ์ ๋ฐ, ๋ํ ์์
SecondActivity.kt์ activity_second.xml Second ์กํฐ๋นํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ญ๋๋ค.
activity_second.xml ์ ๋ฒํผ์ ํ๋ ๋ง๋ญ๋๋ค.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SecondActivity">
<Button
android:id="@+id/secondButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
๋ด๊ฐ ์์
์ ํ๋ค๊ฐ ์ค์๋ก MainActivity.kt์์ secondButton์ ์์ฑํด๋ ์ฝ๋์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ปดํ์ผ ํ์ผ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉฐ ์ฑ์ด ์ฃฝ์ต๋๋ค.
ํผ์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์ค์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ธด ํ์ง๋ง ํ์
์ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ ์ด์์ ์ปดํฌ๋ํธ Id๊ฐ ๊ฒน์ณค์ ๊ฒฝ์ฐ์๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์๊ฐ ๋ญ๋น๋ฅผ ํ๊ฒ ๋ ๊ฒ์
๋๋ค.
์ด๋ฐ์์ผ๋ก ์๋ฌ๋ฅผ ์ ๋ฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ธ์์ ์ฐ์ง ๋ง๋ผ๊ณ ํ๋ ๊ฒ์
๋๋ค.
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// KTX
button1.text = "abcd"
button2.text = "abcd"
button3.text = "abcd"
// SecondActivity์ ์๋ ๋ฒํผ ํธ์ถ
secondButton.text="abcd"
}
}

ViewHolder ์์๋ ์บ์ฑ์ ํด์ฃผ์ง ์์
ViewHolder๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ค๊ณ ๋ง๋ค์ด์ก๋๋ฐ, ์ ์ ViewHolder์์ Koltin-android-extensions์ ์ฌ์ฉํ๋ค๋ฉด ์บ์ฑ์ ํด์ฃผ์ง ์์ต๋๋ค.
๋์ปดํ์ผ ๊ฒฐ๊ณผ๋ฅผ ํตํด ํ์ธํ๋ฉด _findCachedViewById๋ฅผ ์ ๊ณตํ์ง ์์์ ์ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ onBind๋ฅผ ํธ์ถํ ๋๋ง๋ค findViewById๋ฅผ ๋งค๋ฒ ํ๋ ๊ฒ์ด๋ค. ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ์ผ ํ๋RecyclerView.ViewHolder์์ ์ด๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น??
๊ตฌ๊ธ์ ์ํฉ์ ๋ฐ๋ผ ViewBinding๊ณผ DataBinding์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
ViewBinding ์ฌ์ฉ๋ฒ
https://jay-din.tistory.com/61
[์๋๋ก์ด๋] View Binding(๋ทฐ๋ฐ์ธ๋ฉ) ์ฌ์ฉ ๋ฐฉ๋ฒ
์ด ํฌ์คํ ์์๋ View Binding์ Activity์ Fragment์ ์์ ๋ฅผ ๋ค๋ฃฐ ๊ฒ์ด๋ค. // ์ด๋ก ์ด ํ์ํ ์ฌ๋์ ViewBinding vs DataBinding ์ฐธ๊ณ ์ธํ build.gradle android { . .. // ํด๋น ์ฝ๋ ์ถ๊ฐ buildFeatures{ viewBinding = true } } A
jay-din.tistory.com
DataBinding ์ฌ์ฉ๋ฒ
https://jay-din.tistory.com/60
[์๋๋ก์ด๋ Android] Data Binding ์ฌ์ฉ๋ฒ
DataBinding๊ณผ ViewBinding์ด ๋ญ๊ฐ ๋ค๋ฅธ๊ฐ? ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด, DataBinding์ ์ด๋ฆ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ ์ ์๋ค. (๋ฐ์ดํฐ์ ๊ฐ์ด ๊ฒฐํฉํด์ ์ฌ์ฉํ ์ ์์) // ์์ธํ ์ด๋ก ์ ViewBinding vs Data
jay-din.tistory.com
์ฐธ๊ณ
https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/