예전에 코틀린을 사용했을 때, Kotlin Android Extension을 사용할 때 자바에서 findViewById를 일일히 안해줘도 되는 편리함이 마음에 들었었다. 그러던 중, 뷰 바인딩을 알게 되었다.
뷰 바인딩을 사용하면 다음과 같은 이점이 있다.
app 수준의 build.gradle에 다음 내용을 추가해주자.
android {
...
buildFeatures {
viewBinding = true
}
}
안드로이드 스튜디오의 버전이 4.0 이상이라면 위의 코드를
android {
...
viewBinding {
enabled = true
}
}
안드로이드 스튜디오의 버전이 3.6 이상 4.0 미만이라면 위의 코드를 추가해주자.
<LinearLayout ... >
<TextView android:id="@+id/textView1" />
<TextView android:id="@+id/textView1" />
<Button android:id="@+id/button" />
</LinearLayout>
다음과 같은 activity_main.xml 레이아웃 파일이 있다고 가정해보자. 뷰 바인딩을 사용할 시 각 xml 파일에 대한 바인딩 클래스가 생성된다. 위의 xml 파일의 경우 AcitivityMainBinding 이라는 바인딩 클래스가 생성된다. 이는 xml 파일의 이름을 카멜 표기법으로 변환하고 끝에 Binding을 붙인 것이다.
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
}
생성된 바인딩 클래스에 inflate 메소드를 호출하고, getRoot 메소드로 루트 뷰를 반환한 뒤, 이를 setContentView로 화면 상의 활성 뷰로 만들면 된다.
binding.textView1.setText("텍스트뷰1");
binding.textView2.setText("텍스트뷰1");
binding.button.setOnClickListener(view -> {
click();
});
binding.id로 레이아웃 내의 뷰를 참조할 수 있다.
private ActivityMainBinding binding;
@Override
public View onCreateView (LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
binding = ActivityMainBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
뷰를 참조하는 것은 위와 3번과 동일한 방식으로 하면 된다.
Android developers, "뷰 결합", https://developer.android.com/topic/libraries/view-binding?hl=ko