[안드로이드] findViewById 대신 뷰 바인딩 사용하기
- 모바일/안드로이드
- 2024. 1. 25.
반응형
예전에는 안드로이드에서 뷰에 대한 참조를 하려면 findViewById를 사용해야 했습니다. 그런데 사용되는 XML의 참조 객체가 많아질 수록 사용하기 불편할 뿐더러 반복되는 코드가 지져분해지기 쉽습니다. Butter knife나 extension을 통해 불편함을 해소하긴 했지만 버전 3.6 이상 부터는 안드로이드 뷰 바인딩을 통해 좀 더 편리하게 뷰에 있는 객체에 참조할 수 있게 되었습니다.
findViewById를 사용할 경우 단점
- 느린 속도
- 타입 캐스팅에 따른 예외
- 사용자 실수로 Null 참조
자동 생성되는 파일
만약 뷰 바인딩(View Binding)을 사용하게 된다면 다음과 같이 ViewBinding 을 구현하는 임의의 파일들이 생성됩니다. Activity 클래스와 매핑 되는 클래스로 별도로 작업없이 뷰 바인딩을 사용할 경우 자동으로 클래스가 생성됩니다.
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final Button bindingButton;
...
}
Gradle 수정
다음과 같이 안드로이드 스튜디오 버전에 따라서 해당 구문을 추가해줍니다.
// 안드로이드 스튜디오 4.0 이상
android {
...
buildFeatures {
viewBinding = true
}
}
// 안드로이드 스튜디오 3.6 ~ 4.0
android {
...
viewBinding {
enabled true
}
}
다음은 전체 Gradle 코드입니다.
코드 하단 부분에 안드로이드 4.0 이상 버전을 기준으로 코드가 추가된 것을 확인할 수 있습니다.
android {
namespace 'com.example.viewbindingsample'
compileSdk 33
defaultConfig {
applicationId "com.example.viewbindingsample"
minSdk 26
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
뷰 객체 참조하기
- inflate를 통해 바인딩 클래스 객체를 생성합니다.
- 바인딩 객체의 root를 참조합니다.
- setContentView 를 통해서 view를 설정합니다.
- binding 클래스를 통해서 xml에 선언된 textView에 접근할 수 있습니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 바인딩 클래스의 객체 생성
val view = binding.root // 바인딩 객체의 root 뷰 참조
setContentView(view) // 생성한 뷰 설정
binding.textView.text = "Hello"
}
프래그먼트에서 사용하기
Activity와 약간 다르긴 하지만 inflate를 통해 binding 클래스를 생성하는 것은 동일합니다. 차이점이 있다면 onDestroyView 함수에서 binding 객체를 초기화 해주는 점입니다.
class MyFragment : Fragment() {
private FragmentBlankBinding binding;
@Override
public View onCreateView (LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentMyBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
반응형
'모바일 > 안드로이드' 카테고리의 다른 글
[Android] 안드로이드 adb 설치 방법 (1) | 2024.12.19 |
---|---|
[안드로이드] 리스트 뷰(ListView) XML 데이터로 바인딩 하기 (0) | 2024.02.01 |
[안드로이드] 리스트 뷰(ListView) 사용하기 (0) | 2024.01.17 |
[Android] 안드로이드 뷰와 뷰 그룹, 레이아웃 종류 (0) | 2022.04.12 |
[Android] 안드로이드 앱 우선순위 및 액티비티 생명주기 (0) | 2022.04.11 |