티스토리 뷰
뷰 바인딩
xml에 있는 뷰들을 코드 상에서 바로 가져올 수 있는 기능이다.
코드가 지저분해질 수 있는 큰 원인인 findViewById()를 제거할 수 있다.
또한 findViewById()를 사용하면 관리해야 할 변수가 많아지고,
다른 액티비티의 xml을 가져오면 null값이 대입되어 NullPointerException이 발생할 위험이 있다.
뷰 바인딩을 사용하면 이러한 단점이 해결된다!
변수를 생성할 필요없이 xml의 id를 바로 사용할 수 있기 때문이다.
또한 다른 액티비티의 xml을 가져오면 컴파일 에러가 나기 때문에 비교적 안전하다.
그럼 뷰 바인딩을 적용하는 방법을 알아보자.
1. build.gradle (Module)
android {
...
viewBinding {
enabled = true
}
}
빌드 파일에 위 코드를 입력해서 뷰 바인딩을 활성화시킨 후 Sync를 완료하면,
각 xml 레이아웃 파일의 바인딩 클래스가 따로 생성된다.
이런 바인딩 클래스의 이름은 "xml 파일의 이름을 카멜 표기법으로 변환한 이름 + Binding"이다.
예를 들어 레이아웃 파일 이름이 activity_scan.xml인 경우, 바인딩 클래스 이름은 ActivityScanBinding이 된다.
2. 액티비티에서 뷰 바인딩 사용
- 먼저 바인딩 클래스 타입을 가지는 binding 변수를 생성한다.
- onCreate()에서 바인딩 클래스의 inflate()를 호출한다.
inflate()는 바인딩 클래스 인스턴스를 반환하는데, 이 값을 binding 변수에 넣는다.
앞으로 이 binding 변수를 통해 xml의 뷰들을 편리하게 가져올 것이다.
- setContentView()에 루트 뷰(binding.root)를 전달한다.
기존에는 setContentView()에 xml 레이아웃의 파일명을 전달했지만, 이번엔 바인딩 클래스에서 얻는 루트 뷰로 액티비티를 활성화시킨다.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}
3. 뷰 참조하기
이제 findViewById()가 아닌, binding 변수를 이용해 뷰를 참조한다.
만약 레이아웃 xml 파일에 button이라는 id를 가진 버튼이 하나 있다고 가정한다면, 아래와 같이 코드를 작성할 수 있다.
binding.button.setOnClickListener { finish() }
https://developer.android.com/topic/libraries/view-binding?hl=ko#kotlin
'android' 카테고리의 다른 글
[안드로이드/android] FragmentDialog, CustomDialog match_parent가 안되는 경우 (0) | 2023.09.20 |
---|---|
[안드로이드/android] Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option 에러 (0) | 2023.09.20 |
[안드로이드/코틀린] 툴바(Toolbar) 커스텀 방법 (1) | 2023.09.16 |
[안드로이드/android] os 12 이상 스플래시 화면 (0) | 2023.08.02 |
[안드로이드/android] 자바로 백그라운드 서비스 WorkManager 구현하기 (0) | 2022.09.29 |