ANDROID
Android View Binding(안드로이드 뷰바인딩)
혀내
2021. 12. 4. 22:43
반응형
Description
기존에는 Android Studio에서 레이아웃에 있는 뷰들을 자바 소스코드에서 동적으로 사용하고 싶을 때, findViewById 메소드로 아래와 같이 뷰와 자바 소스코드를 연결해줘야 했다.
TextView tv_name = findViewById(R.id.tv_name);
TextView tv_addr = findViewById(R.id.tv_addr);
tv_name.setText("혀내");
tv_addr.setText("대한민국");
하지만 매번 Activity와 Fragment에서 findViewById로 뷰와 연결해줘야 한다는 건 좀 번거로운 일이다. 그래서 뷰 바인딩(View Binding)을 통해 이런 연결 과정 없이 뷰를 변수처럼 바로 참조해보고자 한다.
사용 방법
1. build.gradle(:app)에 아래 코드르 복사한다.
android {
...
buildFeatures {
// 뷰 바인딩 활성화
viewBinding true
}
}
2. 레이아웃 파일을 하나 생성한다.
<LinearLayout ... >
<TextView android:id="@+id/tv_name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/btn_ok"
android:background="@drawable/rounded_button" />
</LinearLayout>
참고) 뷰 바인딩을 적용하고 싶지 않은 레이아웃 파일은 최상위 뷰에 tools:viewBindingIgnore="true"를 추가한다.
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
3. layout의 Activity에서 아래 코드를 복사한다.
// 전역 변수로 바인딩 객체 선언
private var binding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
// 바인딩 클래스의 인스턴스를 생성
binding = ActivityMainBinding.inflate(layoutInflater)
// 우리가 만든 루트 뷰를 액티비티에 표시
setContentView(binding.root)
// tv_name -> tvName으로 자동 변환되어 사용할 수 있음!
binding.tvTitle.setText("Hello World..")
}
// 액티비티가 파괴될 때
override fun onDestroy() {
// binding class 인스턴스 참조 정리
binding = null
super.onDestroy()
}
}
findViewById와의 차이점
- Null 안전성
View Binding은 뷰를 직접 참조하기 때문에 NullPointerException이 발생하지 않는다.
- Type 안전성
뷰를 직접 참조하기 때문에 타입 변환 에러가 발생하지 않는다.
참고자료: https://developer.android.com/topic/libraries/view-binding?hl=ko#kotlin
반응형