쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • livedata
  • 리사이클러뷰
  • 배열
  • Room
  • mvvm
  • Adapter
  • ViewModel
  • Android
  • 상속
  • workmanager
  • 프로젝트회고
  • 코틀린코테
  • 코틀린
  • 자바
  • 코딩테스트
  • compose
  • 기초100제
  • Jetpack
  • 자료구조
  • AAC
  • 메소드
  • DataBinding
  • 백준
  • 알고리즘
  • Kotlin
  • 코드업100제
  • 컴포즈
  • 코테
  • 변수
  • 객체지향

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] Activity/Fragment 의 ViewModel 공유
Android/JETPACK

[JETPACK개론] Activity/Fragment 의 ViewModel 공유

2022. 8. 12. 23:59

전 글에서는 간단하게 Activity에서의 ViewModel 사용을 해보았다.

이번 글에서는 먼저 Fragment에서 ViewModel을 사용해보자!

val transaction = manager.beginTransaction()
val fragment = TestFragment()
transaction.replace(R.id.frameArea, fragment)
transaction.addToBackStack(null)
transaction.commit()

먼저 fragment layout을 만들고, 위의 코드와 같이 액티비티에서 framlayout을 형성하여 fragment로 변환해준다.

class TestFragmentViewModel : ViewModel() {

    var countValue = 0

    fun plus(){
        countValue++
    }
    fun minus(){
        countValue--
    }
}

그리고 전 글과 똑같이 ViewModel을 만들어주고,

binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false)

        viewmodel= ViewModelProvider(this).get(TestFragmentViewModel::class.java)

        binding.resultArea.text = viewmodel.countValue.toString()

        binding.plus.setOnClickListener {
            viewmodel.plus()
            binding.resultArea.text = viewmodel.countValue.toString()
//            countValue++
//            binding.resultArea.text = countValue.toString()
        }

        binding.minus.setOnClickListener {
            viewmodel.minus()
            binding.resultArea.text = viewmodel.countValue.toString()
//            countValue--
//            binding.resultArea.text = countValue.toString()
        }

액티비티에서의 ViewModel을 사용했던 것처럼 똑같이 코드를 구현하였다.

하지만 ViewModel은 액티비티의 라이프사이클을 고려하기 때문에 데이터가 또 다시 초기화되는 문제가 발생했다.

이는 savedInstanceState 를 사용하여 문제를 해결할 수 있다!!!

if(savedInstanceState == null){
    val transaction = manager.beginTransaction()
    val fragment = TestFragment()
    transaction.replace(R.id.frameArea, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}

이 방법 이외에도 액티비티하고 프래그먼트에서 ViewModel을 공유하여 데이터를 보존하는 방법이 있다!

 

Activity/Fragment 의 ViewModel 공유

먼저 dependencies에 다음을 추가하자.

implementation 'androidx.fragment:fragment-ktx:1.5.1'

그리고 초록색의 frame_layout을 만들어주고, 액티비티에서의 ViewModel 값이 프래그먼트에서도 공유가 되는지 확인해보자!

MainActivity클래스에서 똑같이 버튼을 만들어주고, Fragment클래스에서 다음과 같이 viewmodel을 추가해준다.

private lateinit var binding : FragmentTestBinding
private val viewModel : MainViewModel by activityViewModels()

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false)

    binding.fragmentTest.text = viewModel.getCount().toString()
    // Inflate the layout for this fragment
    return binding.root
}

화면을 돌려도 fragment에서도 데이터가 유지되는 것을 확인할 수 있다!!

 

 

 

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'Android > JETPACK' 카테고리의 다른 글

[JETPACK개론] LiveData  (0) 2022.08.17
[JETPACK개론] ViewModelFactory  (0) 2022.08.16
[JETPACK개론] ViewModel ?  (0) 2022.08.11
[JETPACK개론] View,DataBinding + Adapter  (0) 2022.08.10
[JETPACK개론] DataBinding 과 data class  (0) 2022.07.26
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] LiveData
    • [JETPACK개론] ViewModelFactory
    • [JETPACK개론] ViewModel ?
    • [JETPACK개론] View,DataBinding + Adapter
    쏭식
    쏭식

    티스토리툴바