hugDog
Android DevLog
hugDog
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ™Œ Hello? (162)
    • ๐Ÿงฉ์•ˆ๋“œ๋กœ์ด๋“œ (12)
      • ๊ฐœ๋… ์ •๋ฆฌ (5)
      • ๋ฒ„๊ทธ ํ•ด๊ฒฐ (4)
      • ๊ธฐํƒ€ (3)
    • ๐Ÿ”์•Œ๊ณ ๋ฆฌ์ฆ˜ (54)
      • ๊ฐœ๋… (0)
      • ๋ฐฑ์ค€ (48)
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (6)
    • ๐Ÿ“„๊ฐœ๋ฐœ ์ผ์ง€ (0)
      • FINPO (0)
    • ๐Ÿ”คํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (71)
      • C++ ์ •๋ฆฌ (49)
      • C++๊ธฐ์ดˆํ”Œ๋Ÿฌ์Šค ์—ฐ์Šต๋ฌธ์ œ (20)
      • Kotlin (2)
    • โญProject (1)
    • ๐ŸšดTIL (13)
      • Clean Code (13)
    • ๐Ÿšฉ๊ธฐํƒ€ (9)
      • ๋ชฉํ‘œ (6)
      • ์ผ์ƒ (3)
      • ๋ฌธ์„œ (0)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
hugDog

Android DevLog

๐Ÿงฉ์•ˆ๋“œ๋กœ์ด๋“œ/๊ธฐํƒ€

Android Studio: viewBinding ์‚ฌ์šฉ๋ฒ• (kotlin synthetics ๋Œ€์ฒด)

2020. 12. 17. 20:45
728x90

 

viewBinding

viewBinding ์š”์†Œ๋ฅผ build.grade ํŒŒ์ผ์— ๋ณต์‚ฌํ•œ๋‹ค.

android {
		...
        viewBinding {
        	enabled = true
            }
        }

 

result_profile.xml ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

<LinearLayout ... >
        <TextView android:id="@+id/name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/button"
            android:background="@drawable/rounded_button" />
    </LinearLayout>

 

์ด ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ ๊ฒฐํ•ฉ ํด๋ž˜์Šค ์ด๋ฆ„์€ ResultProfileBinding(name๊ณผ button ๋‘ ํ•„๋“œ๋ฅผ ๊ฐ€์ง)์ด ๋œ๋‹ค.

(๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ ์ด๋ฆ„์„ ์นด๋ฉœํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ ํ›„ ๋์— Binding์„ ์ถ”๊ฐ€)

 

๊ฒฐํ•ฉ ํด๋ž˜์Šค์—๋Š” ์ƒ์‘ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์˜ ๋ฃจํŠธ ๋ทฐ์— ๊ด€ํ•œ ์ง์ ‘ ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” getRoot() ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

(ResultProfileBinding ํด๋ž˜์Šค์˜ getRoot()๋ฉ”์„œ๋“œ๋Š” LinearLayout ๋ฃจํŠธ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.)

 

Activity์—์„œ ๋ทฐ ๊ฒฐํ•ฉ ์‚ฌ์šฉ

1 ์ƒ์„ฑ๋œ ๊ฒฐํ•ฉ ํด๋ž˜์Šค์— ํฌํ•จ๋œ inflate() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

2 getRoot()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ Kotlin ์†์„ฑ ๊ตฌ๋ฌธ์„ ์ƒ์š”ํ•˜์—ฌ ๋ฃจํŠธ ๋ทฐ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ด

3 ๋ฃจํŠธ๋ทฐ๋ฅผ setContentView()์— ์ „๋‹ฌํ•˜์—ฌ ํ™”๋ฉด์ƒ์˜ ํ™œ์„ฑ๋ทฐ๋กœ ๋งŒ๋“ฌ.

 

    private lateinit var binding: ResultProfileBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ResultProfileBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }

 

์ด์ œ ๊ฒฐํ•ฉ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ ์ฐธ์กฐ ๊ฐ€๋Šฅ

    binding.name.text = viewModel.name
    binding.button.setOnClickListener { viewModel.userClicked() }

 

๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์˜ˆ์‹œ

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        val binding = ResultProfileBinding.inflate(layoutInflater)
    
        setContentView(binding.root)
        binding.name.text = viewModel.name
    	binding.button.setOnClickListener { viewModel.userClicked() }
    }

 

์ œ์ผ ์ข‹์€ ๋ฐฉ๋ฒ•

class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate() {
        super.onCreate()
        setContentView(binding.root) // * setContentView์—๋Š” binding.root๋ฅผ ๊ผญ ์ „๋‹ฌ
    }
    fun test() {
        // binding ์ด ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•กํ‹ฐ๋น„ํ‹ฐ ์ „์ฒด์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
        // binding.์œ„์ ฏid.์†์„ฑ = "๊ฐ’"
        binding.textView.text = "hello binding"
    }
}

 

 

Fragment์—์„œ ๋ทฐ ๊ฒฐํ•ฉ ์‚ฌ์šฉ

class ListFragment : Fragment() {
    // lateinit์œผ๋กœ binding์„ ์„ ์–ธ
    lateinit var binding:FragmentListBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentListBinding.inflate(inflater, container,false)
        return binding.root
    }
    fun test() {
        // binding ์ด ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ž˜๊ทธ๋จผํŠธ ์ „์ฒด์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
        // binding.์œ„์ ฏid.์†์„ฑ = "๊ฐ’"
        binding.textView.text = "hello fragment"
    }
}

 

 

Adapter์—์„œ ๋ทฐ ๊ฒฐํ•ฉ ์‚ฌ์šฉ

class CustomAdapter : RecyclerView.Adapter<Holder>() {
    // ๋ฐ”์ธ๋”ฉ.inflate() ๊ตฌ์กฐ๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ์™€ ๋™์ผ
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding) 
    }
    ... ์ƒ๋žต
}
// val ์˜ˆ์•ฝ์–ด๋กœ ๋ฐ”์ธ๋”ฉ์„ ์ „๋‹ฌ ๋ฐ›์•„์„œ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
// ๊ทธ๋ฆฌ๊ณ  ์ƒ์†๋ฐ›๋Š” ViewHolder ์ƒ์„ฑ์ž์—๋Š” ๊ผญ binding.root๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
class Holder(val binding: ItemRecyclerBinding) : RecyclerView.ViewHolder(binding.root) {
    fun setValue(value:String) {
        // ์ƒ์„ฑ์ž์—์„œ val๋กœ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™€๋” ๋‚ด๋ถ€ ์–ด๋””์—์„œ๋‚˜ binding ์‚ฌ์šฉ๊ฐ€๋Šฅ
        binding.textView.text = value 
    }
}

 

 

 

์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ ↓

https://developer.android.com/topic/libraries/view-binding?hl=ko#kotlin

 

๋ทฐ ๊ฒฐํ•ฉ  |  Android ๊ฐœ๋ฐœ์ž  |  Android Developers

๋ทฐ ๊ฒฐํ•ฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ทฐ ๊ฒฐํ•ฉ์€ ๋ชจ๋“ˆ์— ์žˆ๋Š” ๊ฐ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์˜ ๊ฒฐํ•ฉ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ํด๋ž˜์Šค์˜

developer.android.com

flow9.net/bbs/board.php?bo_table=android&wr_id=27

 

[๋ทฐ๋ฐ”์ธ๋”ฉ] ์ฝ”ํ‹€๋ฆฐ ์ต์Šคํ…์…˜ ๋Œ€์ฒด๋ฅผ ์œ„ํ•œ viewBinding ์ฒ˜๋ฆฌ > Android | flow9.net - ์ฝ”ํ‹€๋ฆฐ, ์•ˆ๋“œ๋กœ์ด๋“œ

๊ตฌ๊ธ€์—์„œ ๊ณต์‹์œผ๋กœ ๋ณด๋‚ธ ๋ทฐ๋ฐ”์ธ๋”ฉ ๊ฐ€์ด๋“œ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•ด์„œ ์ข‹๋„ค์š”

flow9.net

 

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ (์ƒˆ์ฐฝ์—ด๋ฆผ)
    '๐Ÿงฉ์•ˆ๋“œ๋กœ์ด๋“œ/๊ธฐํƒ€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Android/Kotlin] getString(), getColor(), getDrawable() ์‚ฌ์šฉ๋ฒ• (strings.xml, colors.xml, drawable.xml Resource ๊ฐ€์ ธ์˜ค๊ธฐ)
    • Android/Kotlin: OkHttp3๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSocket ํ†ต์‹ ์„ ํ•˜๋Š” ๋ฒ•
    hugDog
    hugDog
    ์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต๋ถ€ ์ค‘์ธ ํ•™์ƒ์ž…๋‹ˆ๋‹ค!

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”