TIL240108 D34 MVVM, Fragment 맛보기

jericho·2024년 1월 8일

TIL

목록 보기
33/62

MVVM은 아직 감을 못잡고 있다. (사실 이제 시작해서 그렇기도 하다)
일단 당장은 과제가 급한지라 오늘은 fragment 부분 강의를 들었다. 프래그먼트 자체도 생소하고, 데이터 전달도 볼 게 좀 있어서 하다보니 오늘 하루가 다 가버렸다.

MVVM

액티비티에 대한 뷰모델 클래스를, ViewModel() 상속받아서 만든다.
그리고 위젯의 값을 들고 있을 라이브데이터를 만들고, (이건 _를 붙인 private이다)
그 변수에 대한 게터와 세터도 만든다.
(적다보니, 왜 분리하는지 의문이 생겼다)

class MainViewModel : ViewModel() {
    private val _text1 = MutableLiveData<String>()
    val text1: LiveData<String> get() = _text1
    fun setText1(s: String) {
        _text1.value = s
    }
}

onCreate에서 뷰모델의 변수(text1)에 대한 옵저버를 등록하여 변경되는 값을 넣어준다.

private fun initViewModel() = with(viewModel) {
    text1.observe(this@MainActivity) {
        binding.tv1.text = it
    }
}

버튼 클릭리스너에서 뷰모델에 있는, 위젯에 대응되는 값을 세터를 통해 변경해준다.

binding.btn1.setOnClickListener { viewModel.setText1("hi ${++cnt}") }

이렇게 옵저버를 통해서 위젯의 값을 변경해주고, 비즈니스 로직은 뷰모델이 처리하는 것이 MVVM 패턴이라고 한다. 아직은 감만 잡는 수준이라, 직접 해보는 것은 과제를 제출하고 난 뒤 일요일에 할 것 같다.

Fragment

프래그먼트를 사용하려면 라이브러리를 추가해줘야 한다.

// build.gradle.kts (Module :app) 의 dependencies에
implementation("androidx.fragment:fragment-ktx:1.6.2")
// androidx.frag.. 까지 치고 목록에서 ktx 붙은거로 선택.
// 각자 환경에 따라 자동완성으로 나오는 버전이 다를 수 있다.

소스 패키지 폴더에 new - Fragment - Fragment (blank) 를 추가해준다. 이름은 FirstFragment, SecondFragment로 지어줬다.
일단 소스파일은 자동 생성되어 건드리지 않아도 되고, 프래그먼트 레이아웃을 짜준다.

// MainActivity
private fun setFragment(frag: Fragment) {
    supportFragmentManager.commit {
        replace(binding.fl.id, frag)
        setReorderingAllowed(true)
        addToBackStack("")
    }
}

// onCreate
binding.btn1.setOnClickListener { setFragment(FirstFragment()) }
binding.btn2.setOnClickListener { setFragment(SecondFragment()) }

이렇게 하면 프래그먼트가 띄워진다.

프래그먼트 뷰바인딩과, 데이터 전달을 위한 이러저런 것들이 내용이 많은데, 과제 시간이 부족한 관계로 나중에 정리하도록 하자.

0개의 댓글