- 안드로이드/kotlin
코틀린 뷰 바인딩 view binding 사용하기
더모어더베러
2023. 12. 6. 13:47
[ 안드로이드 스튜디오 버전 Flamingo (2022.2.1) ]
뷰 바인딩 사용법에 대해 정리해보겠습니다.
Gradle 모듈 작성
gradle 모듈에 아래와 같이 코드를 추가 해줍니다.
android {
...
buildFeatures { // 뷰바인딩
viewBinding = true
}
...
}
그 다음 sync now를 눌러 적용해주세요!
적용이 되면 프로젝트 상의 레이아웃 파일들 (xml 파일)이 바인딩 클래스라는 녀석이 생기게되고,
각 파일들에 선언해두었던 뷰 들의 id 들의 참조가 포함됩니다.
==============================================================================
자동으로 생성된 바인딩 클래스의 이름이 지어지는 기준은 기존에 작성하신 레이아웃 파일 이름에서 조금 변형 됩니다.
1. 파스칼 케이스(첫 글자 대문자) + 카멜 케이스 (낙타의 굽은 등 처럼 단어 단위로 대 소문자처리)
2. 파일 이름 끝에 Binding 이라는 명칭이 달라붙습니다.
for example ) activity_main.xml -> ActivityMainBinding
==============================================================================
액티비티에서 binding 사용하기
class MainActivity : AppCompatActivity() {
// 전역 변수로 바인딩 객체 선언
private var mBinding: ActivityMainBinding? = null
// 매번 null 체크를 할 필요 없이 편의성을 위해 바인딩 변수 재 선언
private val binding get() = mBinding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 기존 setContentView 를 제거해주시고..
// setContentView(R.layout.activity_main)
// 자동 생성된 뷰 바인딩 클래스에서의 inflate라는 메서드를 활용해서
// 액티비티에서 사용할 바인딩 클래스의 인스턴스 생성
mBinding = ActivityMainBinding.inflate(layoutInflater)
// getRoot 메서드로 레이아웃 내부의 최상위 위치 뷰의
// 인스턴스를 활용하여 생성된 뷰를 액티비티에 표시 합니다.
setContentView(binding.root)
// 이제부터 binding 바인딩 변수를 활용하여 마음 껏 xml 파일 내의 뷰 id 접근이 가능해집니다.
// 뷰 id도 파스칼케이스 + 카멜케이스의 네이밍규칙 적용으로 인해서 tv_message -> tvMessage 로 자동 변환 되었습니다.
binding.tvMessage.setText("안녕하세요 홍드로이드 입니다.")
}
// 액티비티가 파괴될 때..
override fun onDestroy() {
// onDestroy 에서 binding class 인스턴스 참조를 정리해주어야 한다.
mBinding = null
super.onDestroy()
}
}
프래그먼트에서 binding을 사용 한다면 아래와 같이 사용 하시면 됩니다.
class MainFragment : Fragment() {
// 바인딩 객체 타입에 ?를 붙여서 null을 허용 해줘야한다. ( onDestroy 될 때 완벽하게 제거를 하기위해 )
private var mBinding: FragmentMainBinding? = null
// 매번 null 체크를 할 필요 없이 편의성을 위해 바인딩 변수 재 선언
private val binding get() = mBinding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 액티비티 와는 다르게 layoutInflater 를 쓰지 않고 inflater 인자를 가져와 뷰와 연결한다.
mBinding = FragmentMainBinding.inflate(inflater, container, false)
binding.tvMessage.setText(" 안녕 나는 홍드로이드야 !")
return binding.root
}
// 프래그먼트가 destroy (파괴) 될때..
override fun onDestroyView() {
// onDestroyView 에서 binding class 인스턴스 참조를 정리해주어야 한다.
mBinding = null
super.onDestroyView()
}
}