๐ SeSAC์ 'JetPack๊ณผ Kotlin์ ํ์ฉํ Android App ๊ฐ๋ฐ' ๊ฐ์ข๋ฅผ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค.
- findViewById()
- ButterKnife
- Kotlin Android Extension
- DataBinding
- ViewBinding
- findViewById()
๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์ด์ ๊ฐ์ฅ ๋จ์ํ๋ฉด์ ์ฝ๋๊ฐ ๊ธด ๋ฐฉ๋ฒ
- ButterKnife
์๋นํ ์ ๋ช
'ํ๋' ํ๋ ์์
- Kotlin Android Extension
์๋๋ก์ด๋์์ ์ฝํ๋ฆฐ์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ฉด์ ํ๋์ ์ฐ์๋ ๊ธฐ๋ฒ
๋ทฐ๋ฐ์ธ๋ฉ์ ๋ฑ์ฅ๊ณผ ๋์์ deprecated ๋นํ๋ค.
- DataBinding
๊ตฌ๊ธ์์ ์ ์ํ๊ณ ์๋ ๊ธฐ๋ฒ
์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๋ Kotlin Android Extension ์ฒ๋ผ ์ ๊ธฐ๊ฐ ์ ๋ ฅํ๋ค...
- ViewBinding
๊ตฌ๊ธ์์ ์ ์ํ๊ณ ์๋ ๊ธฐ๋ฒ
๊ฐ์ฅ ์ต์ ๊ธฐ๋ฒ์ด๋ค. ๋ทฐ๋ฐ์ธ๋ฉ์ ๋ฑ์ฅ๊ณผ ํจ๊ป Kotlin Android Extension ๊ฐ deprecated ๋๋ค.
android {
viewBinding {
enabled = true
}
}
XML ํ์ผ์ ๋ฑ๋ก๋ ๋ทฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ Binding ํด๋์ค๊ฐ generate
activity_main.xml -> ActivityMainBinding
val binding = ActivityMainBinding.inflate(layoutInflater)
// ์กํฐ๋นํฐ ํ๋ฉด ์ถ๋ ฅ
setContentView(binding.root)
// ๋ทฐ ๊ฐ์ฒด ์ด์ฉ
binding.visibleBtn.setOnClickListener {
binding.targetView.visible = View.VISIBLE
}
binding.invisibleBtn.setOnClickListener {
binding.targetView.visible = View.INVISIBLE
}
Binding ํด๋์ค์ inflate ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ๋งค๊ฐ๋ณ์๋ก layoutInflator ๋ฅผ ์ ๋ฌํ์ฌ ๊ฐ์ฒด ํ๋
Binding ๊ฐ์ฒด์ root ํ๋กํผํฐ์๋ 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"
..............
tools:viewBindingIgnore="true">
build.gradle ํ์ผ์ ViewBinding ์ด์ฉํ๊ฒ ๋ค๊ณ ์ ์ธ์ ํ๋ฉด XML ํ๋ ๋น Binding ํด๋์ค๊ฐ ์๋์ผ๋ก generate
XML ํ์ผ์ ์ํ Binding ํด๋์ค๊ฐ ๋ง๋ค์ด์ง ํ์๊ฐ ์๋ ๊ฒฝ์ฐ
tools:viewBindingIgnore="true" ๋ก ์ ์ธ
<?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=".MainActivity">
<Button
android:id="@+id/visibleBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="visible" />
<TextView
android:id="@+id/targetView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#FF0000"
android:gravity="center"
android:text="hello world"
android:textColor="#FFFFFF"
android:textSize="30dp" />
<Button
android:id="@+id/invisibleBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="invisible" />
</LinearLayout>
package com.kotdev99.android.c90
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.visibleBtn.setOnClickListener {
binding.targetView.visibility = View.VISIBLE
}
binding.invisibleBtn.setOnClickListener {
binding.targetView.visibility = View.INVISIBLE
}
}
}