본문 바로가기

카테고리 없음

viewbinding , by lazy viewbinding

val:불변변수 
var:가변 변수 
lateinit var : 초기화 후 값이 바뀔수 있을 때
by lazy : 초기화 후 전용 값으로 사용

 

findviewbyid

lateinit 하면 사용하기 전에 초기화 해주거나, onCreate에서 모두 초기화해주어야 하는데, 등록할 변수가 많아지면 코드 라인을 많이 잡아먹고 누락 등의 문제도 있어서 by lazy로 코드 파편화도 막고 코드 라인도 줄이다

 

binding.root로 바탕이 되는 constraintLayout 등을 View 매개변수의 인자로 전달해야 한다.

그래서 초기화 위치가 onCreate으로 고정되어, binding에 ActivityOooBinding.inflate(layoutInflater)을 넣고 setContentView(binding.root)를 한다.

 

 fvbi와 달리 by lazy가 아닌 lateinit을 써도 초기화 위치가 고정적이고 한 줄만 추가된다.

 

private val binding by lazy { FragmentFirstBinding.inflate(layoutInflater) }
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    return binding.root
}

 lazy 위임을 사용하여 FragmentFirstBinding 객체를 초기화함.

 

프래그먼트의 뷰가 생성될 때까지 바인딩 객체의 초기화를 지연시킨다.
그러나 onDestroyView에서 바인딩 객체를 null로 설정하지 않기 때문에 메모리 누수가 발생할 수 있다.

 

private  var _binding: FragmentSaveInfoBinding? = null
private val binding get() = _binding!!


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    _binding = FragmentSaveInfoBinding.inflate(layoutInflater)
    return binding.root
}

nullable한 _binding 변수를 사용하여 FragmentSaveInfoBinding 객체를 초기화하고,non-null한 binding 속성을 통해 바인딩 객체에 접근

 

 onDestroyView에서 _binding을 null로 설정하여 메모리 누수를 방지한다
프래그먼트의 뷰가 파괴될 때 _binding을 null로 설정함으로써 바인딩 객체가 더 이상 메모리에 남아있지 않도록 함.

728x90