๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] ViewModel - View์— ๊ฐ์ฒด(ViewModel) ์ „๋‹ฌ

interfacer_han 2024. 1. 18. 18:33

#1 ๊ฐœ์š”

#1-1 Data Binding๊ณผ ViewModel

 

[Android] Data Binding - View์— ๊ฐ์ฒด ์ „๋‹ฌ

#1 ๊ฐ์ฒด ์ „๋‹ฌ์˜ ํ•„์š”์„ฑ #1-1 ์ด์ „ ๊ธ€ Data Binding - ๊ธฐ์ดˆ #1 ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ ์ „ #1-1 ์˜ˆ์‹œ ์•ฑ ์œ„๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์•ฑ์ด ์žˆ๋‹ค. Button์„ ๋ˆ„๋ฅด๋ฉด, EditText์˜ text๊ฐ€ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” TextView์˜ text์— ๋Œ€์ž…๋œ๋‹ค. ์ด

kenel.tistory.com

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ด์šฉํ•ด View์— ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ViewModel์˜ ๊ฐ์ฒด ๋˜ํ•œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

#1-2 ViewModel์ด ์“ฐ์ธ ์ƒ˜ํ”Œ ์•ฑ

 

[Android] LiveData - ๊ธฐ์ดˆ

#1 ๊ฐœ์š” #1-1 LiveData LiveData ๊ฐœ์š” | Android ๊ฐœ๋ฐœ์ž | Android Developers LiveData๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. developer.android.com LiveData. ๋ฌธ์„œ์ ์ธ ์ •์˜๋Š” Data์˜ ๋ณ€๊ฒฝ์„ ๊ด€

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์˜ ์™„์„ฑ๋œ ์•ฑ์„ ํ† ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

 

#2 View์— ๊ฐ์ฒด(ViewModel) ์ „๋‹ฌ

#2-1 activity_main.xml์—์„œ <variable> ํƒœ๊ทธ ์ถ”๊ฐ€ ๋ฐ ํ™œ์šฉ

<?xml version="1.0" encoding="utf-8"?>

<layout ...>

    <data>
        <variable
            name="myViewModel"
            type="com.example.viewmodeltoview.MainActivityViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout ...>

        <Button
            android:id="@+id/countButton"
            ...
            android:onClick="@{()->myViewModel.updateCount()}"
            ... />

        ...

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  <variable>์„ ๋“ฑ๋กํ•œ๋‹ค. ์ด์ œ Activity๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ MainActivityViewModel์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋ฏ€๋กœ, MainActivityViewModel.updateCount() ๋ฉ”์†Œ๋“œ๋ฅผ View์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. <Button>์— android:onClick ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ๊ฐ’์—๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ‘œํ˜„์‹๊ณผ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ํ™œ์šฉํ•ด ๋„ฃ์–ด์ค€๋‹ค.

 

#2-2 MainActivity.kt์—์„œ View์— ViewModel ์ „๋‹ฌํ•˜๊ธฐ

...

class MainActivity : AppCompatActivity() {

    ...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        
        binding.myViewModel = viewModel // activity_main.xml์˜ 'myViewModel'์— MainActivityViewModel์˜ ๊ฐ์ฒด 'viewModel' ๋„ฃ๊ธฐ
        viewModel.count.observe(this, Observer {
            binding.countText.text = it.toString()
        })
/*        
        binding.countButton.setOnClickListener {
            viewModel.updateCount()
        }
*/        
    }
}

๋จผ์ €, View์—์„œ ์ •์˜ํ–ˆ๋˜ <variable>์ธ viewModel์— MainActivityViewModel์˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ViewModel์ด ์ „๋‹ฌ๋œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ, ์•„๊นŒ ID๊ฐ’์ด "countButton"์ธ <Button>์— ์ •์˜ํ–ˆ๋˜ android:onClick ์†์„ฑ์ด ์ •์ƒ์ž‘๋™ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, MainActivity์—์„œ View ์š”์†Œ์˜ ํด๋ฆญ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ด์ œ ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•ด๋‹น๋˜๋Š” ํ•„์š”์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ฃผ์„์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค ์ œ๊ฑฐํ•ด๋ฒ„๋ ธ๋‹ค. ์ถ”๊ฐ€๋กœ, ์ฝ”๋“œ ์ค‘ viewModel.count.observe( ... )์˜ ์ œ๊ฑฐ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค.

#3 ์š”์•ฝ

View์—์„œ ์ง์ ‘ View Model์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

#4 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/view-model/ViewModelToView at master ยท Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com