fragment에서 lazy를 쓸 때 주의할 점

상상코딩·2022년 5월 10일
0

안드로이드

목록 보기
16/21

문제상황

프래그먼트에 lazy로 어떤 변수를 선언해두고 썼는데, 얘가 다시 돌아왔을 때 제대로 동작을 안함.

예)

class FragmentA{
	val tabList:Array<View> by {arrayOf(binding.tab1, binding.tab2, binding.tab3)}
}

여기서 FragmentB로 갔다가 다시 A로 돌아왔을때 tabList가 제대로 작동하지 않음.



원인 1

기본적으로 프래그먼트는 제거 될때, 뷰를 파괴한다. 그러나 lazy변수는 레퍼런스가 clear되지 않음. 따라서 한번 할당되면 이전 뷰를 참조하고 있을 수 있음.

원인 2

  1. 프래그먼트 A ---replace---> 프래그먼트 B
    이 경우 A는 destroy되고 B가 생성되어 뷰에 보임.

그런데,,

  1. 프래그먼트 A ---replace, backstack에 넣기---> 프래그먼트 B
    이 경우는 A가 완전히 destroy되지 않고 OnDestroyView까지만 타고 백버튼 눌렀을 때 이를 재사용함. onCreateView부터 다시 탐!

해결방법

  1. lateinit으로 선언후 onCreateView에서 할당.
  2. get()으로 매 참조마다 가져오도록 함.
profile
히히낙낙

0개의 댓글