반응형
토이 프로젝트를 진행하면서 Android Navigation을 사용했는데 하나의 Activity에 여러 개의 Fragment가 종속되다 보니 데이터를 같이 공유할 필요가 있어서 방법을 찾아보았다. 찾아보니 ViewModel을 통해 Activity와 Fragment 간에 데이터 공유가 가능하다고 하여 적용을 해보았다.
📄 MainActivity.kt
class MainActivity : AppCompatActivity() {
private val foodViewModel : FoodViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/***
***/
}
}
androidx.activity package에 정의된 함수(viewModels()
) 이용해서 기존에 지연 초기화 시 사용하는 lateinit 없이 간편하게 초기화할 수 있다.
private lateinit var foodViewModel: FoodViewModel
foodViewModel = ViewModelProvider(this).get(FoodViewModel::class.java)
📄 HomeFragment.kt
class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate){
private val foodViewModel by activityViewModels<FoodViewModel>()
private val adapter = FoodItemAdapter()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.foodCategoryItemList.adapter = adapter
binding.foodCategoryItemList.layoutManager = GridLayoutManager(context, 2)
/***
...
foodViewModel.items.observe(activity as MainActivity, {
adapter.submitList(it)
})
...
***/
}
}
다른 방법들도 있지만 fragment-ktx
를 사용하여 간단히 초기화할 수 있다. activityViewModels<FoodViewModel>()
에 by를 통해 위임해주면 된다.
기존에 Activity와 Fragment에서 데이터 공유할 때 object 클래스를 사용해서 공유했는데 object 클래스 같은 경우 전체 application에서 공유가 가능하기 때문에 데이터가 변경될 문제가 있을 수 있기에 신경을 더 써야 했는데 위와 같은 방법으로 데이터를 공유하면 좀 더 관리측면에서 편리할 것 같다.
반응형
'개발 > Android' 카테고리의 다른 글
[Android] ListAdapter에서 submitList()가 동작하지 않는 이유 (0) | 2022.03.10 |
---|---|
[Android] DI(Dependency Injection)란? (0) | 2022.02.24 |
[Android] 실시간 데이터 처리를 위한 STOMP 사용하기 (Kotlin) (0) | 2022.01.26 |
[Android] 앱, 패키지 설치 여부 확인하기 (0) | 2022.01.06 |
[Android] Fragment에서 View Binding 사용 시 주의사항 (0) | 2022.01.03 |
댓글