# 뷰바인딩이란?
원래 레이아웃 XML파일에 정의된 View에 접근하는 방법은 findViewById()메서드를 활용하는 것이었다.
이후 코틀린이 도입되면서 '코틀린 익스텐션'을 통해 쉽게 뷰를 다룰 수 있었다.
그러나 이제는 "뷰 바인딩"이 코틀린 익스텐션을 대체한다.
뷰 바인딩은 코틀린 환경의 안드로이드에서 뷰에 접근하는 새로운 방식이다.
(물론 findViewById는 여전히 쓸 수 있다)
# 뷰바인딩 설정 방법
1. build.gradle(Module:...) 파일 선택
2. android > buildTypes 항목에 buildFeatures { viewBinding true } 설정 추가
3. Sync Now 클릭
# 뷰바인딩 사용 방법
1. 레이아웃XML파일 생성
2. 바인딩 초기화
3. root뷰(레이아웃) 표시
4. ID로 뷰에 접근
class MainActivity : AppCompatActivity() {
// 여기서 lazy로 초기화하고 사용해도 됨
// val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. 바인딩 초기화
val binding = ActivityMainBinding.inflate(layoutInflater);
// 2. 레이아웃(root뷰) 표시
setContentView(binding.root);
// 3-1.뷰바인딩으로 버튼 접근
binding.myButton.setOnClickListener {
// 3-2. 뷰바인딩으로 텍스트뷰 접근
binding.myTextView.text = "바인딩이 잘 되네요!";
}
}
각각에 대해 자세히 설명하면 아래와 같다.
1. 레이아웃.XML 생성
: activity_main.xml 파일에 버튼(id: myButton), 텍스트뷰(id: myTextView)를 생성했다고 가정
2. 바인딩 생성
: 레이아웃 파일명의 첫글자와 언더바( _ ) 다음 글자를 대문자로 바꾸고, 뒤에 Binding을 붙인 이름으로 바인딩이 생성된다.
: infalte(layoutInflater) 로 초기화하여 변수에 저장해준다.
// 바인딩 초기화
val binding = ActivityMainBinding.inflate(layoutInflater);
// 참고: 상황에 따라 lazy를 사용해 클래스 프로퍼티로 초기화해도 된다
// val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
3. 레이아웃 설정
: setContentView() 메서드를 통해 root뷰(레이아웃)을 화면에 표시하도록 설정한다.
// 레이아웃(root뷰) 표시
setContentView(binding.root);
4. 뷰 사용
레이아웃파일에 생성해둔 뷰들은 "binding.뷰ID" 로 접근할 수 있다.
// 뷰바인딩으로 버튼 접근
binding.myButton.setOnClickListener {
// 뷰바인딩으로 텍스트뷰 접근
binding.myTextView.text = "바인딩이 잘 되네요!";
}
- 실행 결과
버튼을 누르면 TextView의 텍스트가 변경된다.
Fragment 에서 뷰바인딩을 사용하는 방법은 아래 글 참고
'개발(Development) > Android(안드로이드)' 카테고리의 다른 글
[안드로이드] RadioGroup의 RadioButton 가운데/비율 정렬 배치 방법 (0) | 2021.07.20 |
---|---|
[안드로이드] Constraint Layout의 chain weight(비율) 설정 View 배치 방법 (0) | 2021.07.19 |
[안드로이드] ANR(Application Not Responding) 개념과 해결 방법 (0) | 2021.07.18 |
[안드로이드 Java/Kotlin] 시스템 효과음 재생 방법: Ringtone (0) | 2021.07.15 |
[안드로이드 Java/Kotlin]시스템 기본 제공 진동패턴 사용 방법: createPredefined (0) | 2021.07.15 |
댓글