findViewById 를 안 쓰고,
xml에 써둔 id에 대해서 binding class가 따로 만들어지는 방법이라고 한다.
예제로,
new Project - Basic Activity를 만들어보면,
이미 view binding이 세팅되어 있다.
build.gradle (app level)에 아래 옵션이 들어가 있으면 된다.
android {
...
buildFeatures {
viewBinding true
}
...
}
// MainActivity.kt를 보면
private lateinit var binding: ActivityMainBinding
이 변수가 선언되어 있는데,
ActivityMainBinding이 자동으로 만들어지는 듯하다.
이 클래스의 이름은 xml의 이름을 activity_main.xml을 파스칼표기법에 + Binding을 붙이는 것 같다.
// MainActivity.kt - onCreate()에서
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.id.function~
}
위에 초기화 안했던 lateinit인 binding변수가 onCreate 에서 inflate함수사용으로 초기화 되고,
setContentView에 binding.root를 넣어준다.
그리고 나면
binding.[내가 지정한 id값]으로 xml에 지정했던 값을 사용하면 된다.
// Fragement에서는 좀 다르게 사용하던데
// FirstFragment.kt에서
private var _binding: FragmentFirstBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
실질적으로 들어가는건 _binding이고
사용하는 부분은 _binding을 참조하는 binding변수가 된다.
Fragment생명주기에서
onCreateView에서 _binding을 초기화 하고,
셋팅된 binding.root를 넘겨준다.
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentFirstBinding.inflate(inflater, container, false)
return binding.root
}
그리고
onViewCreated()에서
필요한 id값을 Activity에서와 동일하게 사용하면 된다.
binding.id~
onDestoryView()에서
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
_binding을 초기화 해주면서,
binding변수도 같이 메모리 해제 될 것으로 보인다.
findViewById 를 줄곧 잘 써와서 딱히 불편한 게 없었는데,
뷰바인딩이 쉬우니 써봐야겠다.
구글문서를 보면 findViewByID와의 차이점 비교가 있는데,
뷰 바인딩을 쓰면 컴파일 타임에 null이나 타입 안정성을 확보할 수 있다고 한다.
그리고 데이터 바인딩과 차이점 및 유의사항도 있으니 읽어보시길.
그리고 영문 문서에 Provide hints for different configurations섹션이 추가되어있으니 한글문서 볼 때 주의바람.
https://developer.android.com/topic/libraries/view-binding
'Android > Kotlin in android' 카테고리의 다른 글
안드로이드 버튼 android:src와 app:srcCompat 두 속성의 차이점 (with. chatgpt) (0) | 2024.02.23 |
---|---|
android android:gravity와 android:layout_gravity의 차이 (0) | 2023.08.25 |
RecyclerView를 연습해보았다 (공부한 자료 & 회고) (0) | 2023.04.28 |
코루틴coroutine &플로우flow 학습 했던거 회고 (0) | 2023.04.25 |
힐트 hilt 공부 방법, 용어 메모, ide에서 아이콘설명 (개인공부) (0) | 2022.10.15 |