๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐˜ˆ๐˜ฏ๐˜ฅ๐˜ณ๐˜ฐ๐˜ช๐˜ฅ๐˜š๐˜ต๐˜ถ๐˜ฅ๐˜ช๐˜ฐ-๐˜’๐˜ฐ๐˜ต๐˜ญ๐˜ช๐˜ฏ

View Binding

๋ทฐ ๊ฒฐํ•ฉ View Binding 

  • findViewById() ๋ฅผ ๋Œ€์ฒด ํ•˜๋ฉฐ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ XML ๋ ˆ์ด์•„์›ƒ์˜ ๋ทฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๊ฐ์†Œ 

  • findViewById(), setContentView(R.layout.xxx) ์—†์ด ๋ฐ”๋กœ ๋ทฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋ทฐ ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค์—์„œ ๋ชจ๋“  ๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋กœ ์ƒ์„ฑ 

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋Œ€๋น„ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ํ–ฅ์ƒ

  • ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ๊ฒฝ์šฐ XML ๋‚ด <layout> ํƒœ๊ทธ์™€ ๋ฐ”์ธ๋”ฉ ํ‘œํ˜„์‹@{}์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, ๋ทฐ ๋ฐ”์ธ๋”ฉ์€ ๋‹จ์ˆœํžˆ ๋ทฐ ๊ฐ์ฒด ์ ‘๊ทผ์— ์ดˆ์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์†๋„, ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์šฐ์ˆ˜

Null Safety ๋ณด์žฅ

  • ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ๊ฒฝ์šฐ ID ๋ฅผ ์ž˜๋ชป์ ์–ด๋„ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ์—†์ด ๋Ÿฐํƒ€์ž„์—์„œ ๊ทธ๋Œ€๋กœ NullPointerException ๋ฐœ์ƒ
  • ๋ทฐ ๋ฐ”์ธ๋”ฉ์— ๊ฒฝ์šฐ XML์— ์ •์˜๋œ ๋ทฐ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ์ž˜๋ชป๋œ ID๋‚˜ NULL ์ ‘๊ทผ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€
  • lateinit ํ˜น์€ !! ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ ๊ฑฐ์˜ ํ•„์š” ์—†์Œ
๋ชจ๋“  ๋ทฐ ํƒ€์ž…์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ 
๊ตฌ์„ฑ ์š”์†Œ ViewBinding ์‚ฌ์šฉ
Activity  ActivityMainBinding
Fragment FragmentMainBinding + onCreateView()
ViewHolder ItemRowBinding ๋“ฑ์œผ๋กœ inflate ๊ฐ€๋Šฅ

 

View Binding์„ ์‚ฌ์šฉ ํ•˜๋Š” ์ด์œ 

์•ˆ์ „ํ•จ ์ปดํŒŒ์ผ ์‹œ์ ์— ์˜ค๋ฅ˜ ๊ฐ์ง€ (NullPointer ๋ฐฉ์ง€)
๊ฐ„๊ฒฐํ•จ ์ฝ”๋“œ๋Ÿ‰ ๋Œ€ํญ ๊ฐ์†Œ (findViewById ์ƒ๋žต)
์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์›€
์œ ์—ฐ์„ฑ ์•กํ‹ฐ๋น„ํ‹ฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ, ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ ๋“ฑ ๋ชจ๋“  ๊ตฌ์กฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

โœ… ViewBinding ํ™œ์„ฑํ™”

  • ๐Ÿ“˜Gradle Scripts -> build.gradle(Moudule:app)
android {
    ...
    buildFeatures {
        viewBinding = true
    }
}
  • ๐Ÿ” ์„ค์ • ํ›„ Gradle Sync ( ๐Ÿ“˜ ์ƒ๋‹จ ๋ฉ”๋‰ด File → Sync Project with Gradle Files )
<!-- MainActivity.kt -->
import com.example.ํ”„๋กœ์ ํŠธ๋ช….databinding.ActivityMainBinding
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }//end of onCreate
}//end of class

 

โœ… ViewBinding ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์‹œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์›์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
ViewBinding ๋น„ํ™œ์„ฑํ™” build.gradle(:app) → viewBinding true
XML ์ด๋ฆ„ ๋ถˆ์ผ์น˜ ActivityMainBinding์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ ์ด๋ฆ„์—์„œ ์ž๋™ ์ƒ์„ฑ
res/layout/activity_main.xml → ActivityMainBinding
activity_main.xml ํ˜•์‹์ธ์ง€ ํ™•์ธ
๋นŒ๋“œ ๋ฌธ์ œ Clean/Rebuild, IDE ์žฌ์‹œ์ž‘
import ๋ฌธ์ œ ์ˆ˜๋™์œผ๋กœ ActivityMainBinding import

 

โœ… inflate(layoutInflater)

  • xml ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค์„œ View ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • binding = ActivityMainBinding.inflate(layoutInflater)
    • main.xml ํŒŒ์ผ์„ ๋ทฐ ๋ฐ”์ธ๋”ฉ์ด ์ž๋™ ์ƒ์„ฑํ•œ ActivityMainBinding ํด๋ž˜์Šค์—์„œ layoutInflater๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
    • binding๋ฅผ ํ†ตํ•ด ๊ฐ ๋ทฐ์— ์ ‘๊ทผ
  • setContentView( binding.root ) : ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ์•กํ‹ฐ๋น„ํ‹ฐ ํ™”๋ฉด์— ํ‘œ์‹œ