2024. 3. 31. 18:35, ๐ฑAndroid Study
๋ฐ์ํ
1. ๋ทฐ ๋ฐ์ธ๋ฉ (View Binding) = ๋ทฐ ๊ฒฐํฉ
- ๋ทฐ์ ์ํธ์์ฉํ๋ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ
- ๋ทฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ๋, ์๋๋ก์ด๋ ์คํ๋์ค๋ XML ๋ ์ด์์ ํ์ผ์ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ธ๋ฉ ํด๋์ค๋ฅผ ์๋ ์์ฑ
- ๋ฐ์ธ๋ฉ ํด๋์ค๋ ๋ ์ด์์์ ID๊ฐ ์๋ ๋ชจ๋ ๋ทฐ์ ๋ํ ์ง์ ์ฐธ์กฐ๋ฅผ ํฌํจ, ์ด๋ฅผ ํตํด ์ฝ๋์์ ์ง์ ๋ทฐ์ ์ ๊ทผ
- ๋ฐ์ธ๋ฉ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ ์ด์์ ํ์ผ ์ด๋ฆ ๋ค์ 'Binding'์ ๋ถ์ฌ ๋ง๋ค์ด์ง
(์) ๋ ์ด์์ ํ์ผ ์ด๋ฆ์ด `activity_main.xml`์ธ ๊ฒฝ์ฐ, ์์ฑ๋๋ ๋ฐ์ธ๋ฉ ํด๋์ค์ ์ด๋ฆ์ `ActivityMainBinding`
(์) ๋ ์ด์์ ํ์ผ ์ด๋ฆ์ด `fragment_home.xml`์ธ ๊ฒฝ์ฐ, ์์ฑ๋๋ ๋ฐ์ธ๋ฉ ํด๋์ค์ ์ด๋ฆ์ `FragmentHomeBinding` - ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ทฐ ๋ฐ์ธ๋ฉ์ด findViewById๋ฅผ ๋์ฒด
2. findViewById์์ ์ฐจ์ด์
1) Null ์์ ์ฑ (Null Safety)
- ๋ทฐ ๋ฐ์ธ๋ฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด, ์ฑ์ด ๋ ์ด์์์ ๊ฐ ๋ทฐ๋ฅผ ์ง์ ์ฐธ์กฐํ ์ ์๊ฒ ํด์ฃผ๋ ์์ ํ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑ
- ์ด๋ ๋ทฐ๋ฅผ ์ฌ์ฉํ ๋ 'null' ๊ฐ์ผ๋ก ์ธํ ์ค๋ฅ,
์ฆ ๋ทฐ๊ฐ ์์ง ํ๋ฉด์ ๋ํ๋์ง ์์๋๋ฐ ๊ทธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์๊ธธ ์ ์๋ ๋ฌธ์ ๋ค์ ์๋ฐฉ - (์) ๋ ์ด์์์ ๋ฒํผ์ด ์์ด์ผ ํ๋๋ฐ ์์ง ๋ฒํผ์ด ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ
-> ๋ทฐ ๋ฐ์ธ๋ฉ์ ์ด๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ์ฑ์ด ์ถฉ๋ํ์ง ์๋๋ก ํจ - (์) ๋ ์ด์์์ ์ผ๋ถ๋ง ๋ทฐ๊ฐ ์๋ ๊ฒฝ์ฐ
-> ๋ทฐ ๋ฐ์ธ๋ฉ์ ํด๋น ๋ทฐ๊ฐ '๊ฐ๋ฅ์ฑ ์๋ null'(Nullable)์์ ์๋ ค์ฃผ์ด, ๊ฐ๋ฐ์์๊ฒ ์ฃผ์๋ฅผ ์ค
2) ํ์ ์์ ์ฑ (Type Safety)
- XML ๋ ์ด์์ ํ์ผ์์ ์ ์๋ ๋ทฐ์ ํ์
๊ณผ ์๋ ์์ฑ๋ ๋ฐ์ธ๋ฉ ํด๋์ค์ ํ๋ ํ์
์ด ํญ์ ์ผ์นํจ
๋ฐ๋ผ์ ํ์ ์ด ์๋ก ๋ง์ง ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์ง - (์) ์ด๋ฏธ์ง ๋ทฐ(ImageView)์ ํ ์คํธ๋ฅผ ์ค์ ํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ ๋ฐ, ๋ทฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ์ค์๋ฅผ ํ ๊ฐ๋ฅ์ฑ์ด ์์ด์ง. ์ฆ, ์ด๋ฏธ์ง ๋ทฐ๋ ์ด๋ฏธ์ง ๋ทฐ๋ก, ํ ์คํธ ๋ทฐ๋ ํ ์คํธ ๋ทฐ๋ก๋ง ์ฌ์ฉ๋๊ฒ ํ์ฌ, ์๋ชป๋ ํ์ ์ฌ์ฉ์ผ๋ก ์ธํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ณด์ฅ
3. ์ฝํ๋ฆฐ์ผ๋ก ๋ทฐ ๋ฐ์ธ๋ฉ ์ค์ ๋ฐ ์ฌ์ฉ๋ฒ
1) gradle์ค์
(ํ์) ๋ชจ๋ ์์ค build.gradle ํ์ผ
android{
...
buildFeatures{
viewBinding = true
}
}
```
(์ ํ) ๋ฐ์ธ๋ฉ ํด๋์ค๋ฅผ ์์ฑํ๋ ๋์ ๋ ์ด์์ ํ์ผ์ ๋ฌด์ -> ๋ ์ด์์ ํ์ผ์ ์ถ๊ฐ
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
- ๋ทฐ ๋ฐ์ธ๋ฉ์ ๋ชจ๋๋ณ๋ก ์ฌ์ฉ ์ค์ ๋จ
- ๋ชจ๋์์ ๋ทฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด ๋ชจ๋ ์์ค build.gradle ํ์ผ์์ viewBinding ๋น๋ ์ต์ ์ true๋ก ์ค์
- ๋ง์ฝ ๋ฐ์ธ๋ฉ ํด๋์ค๋ฅผ ์์ฑํ๋ ๋์ ๋ ์ด์์ ํ์ผ์ ๋ฌด์ํ๋ ค๋ฉด
tools:viewBindingIgnore="true" ์์ฑ์ ๋ ์ด์์ ํ์ผ์ ๋ฃจํธ ๋ทฐ์ ์ถ๊ฐ
2) Activity์์ ์ค์
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.example.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root // ์๋๋ฉด ์ด๊ฑฐ ์์ด ๋ฐ๋ก setContentView(binding.root)
setContentView(view)
}
ํน์ val by lazy๋ก ๊ตฌํ
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.example.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val binding: ActivityMainBinding by lazy {
binding = ActivityMainBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
}
- ํด๋์ค๋ฅผ ์์ ๊ฐ์ด ๋ง๋ฆ (๋ ๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๋ ์์)
- inflate๋ xml์ ์๋ ๋ทฐ๋ฅผ ๊ฐ์ฒดํ
- ์๋๋ R.layout.activity_main์ ๋๊ฒจ์ฃผ์ง๋ง ์ด๋ฒ์๋ ์ฌ๊ธฐ์ ์์ฑํ ๋ฃจํธ ๋ทฐ๋ฅผ ๋๊ฒจ์ค
- binding๋ ๊ฐ์ฒด ์์ ์๋ id์ ์ ๊ทผํ์ฌ ์ฌ์ฉ
(์) binding.button1.text = "์๋ "
(์) binding.button2.setBackgroundColor(Color.BLACK)
4. ๋ทฐ ๋ฐ์ธ๋ฉ ์์
1) ๋น๋ ์ค์ ์ถ๊ฐ
build.gradule (Module :app)
buildFeatures{
viewBinding = true
}
}
2) Layout XML ์์ฑ
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/myTextView"
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/myButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/myTextView" />
</androidx.constraintlayout.widget.ConstraintLayout>
3) MainActivity.kt ์์ฑ
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.myButton.setOnClickListener{
binding.myTextView.text = "๋ฐ์ธ๋ฉ ์ถ๋ ฅ" // ๋ณด๊ณ ์๋ ํ
์คํธ๊ฐ ๋ฐ๋ก ์์ ๋จ. ์ง์ ์ฐธ์กฐ, ์์ ๊ฐ๋ฅ
}
}
}
๐จ ์ฐธ๊ณ ํ๊ธฐ ์ข์ ์ฌ์ดํธ
๋ฐ์ํ
๐ฌ C O M M E N T