처음 안드로이드를 공부할 때
TextView tvName = findViewById(R.id.tv_name);
tvName.setText("snack");
뭐 이런 코드를 작성하며 텍스트 뷰의 텍스트가
코딩한 그대로 앱에 나타나는 것을 보고 참 신기하다고 생각하던 때가 있었습니다.
하지만 시간이 지나고 조금식 규모있는 프로젝트를 시작하여 문제를 하나 느꼈죠..
흠.. 이거 코드에
findViewById()
만 남겠는데..?
뭐 그만큼 findViewById()
가 많이 사용되는 것이죠!
관리해야할 버튼이 20개만 되어도 벌써 어질 어질..
그래서 findViewById()
를 대신할 뷰 바인딩(view binding)
에 대해서 정리해 보겠습니다!
View Binding
은 안드로이드 아키텍쳐 구성요소 중 하나로
뷰와 상호작용 하는 코드를 쉽게 작성할 수 있게 해줍니다.
xml과 연결되는 바인딩 클래스가 자동으로 생성되며
그 클래스의 멤버로 xml의 ID를 가진 모든 뷰를 참조하는
참조 변수가 있습니다!
여기서 바인딩 클래스는 정해진 명명 규칙에 따라서 만들어집니다.
예를 들어
activity_main.xml
-> ActivityMainBinding
fragment_home.xml
-> FragmentHomeBinding
recycler_item.xml
-> RecyclerItemBinding
기존 findViewById
에는 몇가지 문제점이 존재합니다.
- 위에서 적었듯이 코드가 더러워집니다..
- 실수로 없는 id를 사용하면 NULL 오류가 발생합니다.
- 실수로 뷰의 타입을 잘못 적으면 오류가 발생합니다.
ex. TextView -> ImageView
하지만 뷰 바인딩을 사용하면 이런 문제들이 해결되죠!
예전 개발자들은 findViewById
를 사용하였습니다.
그때는 Butter knife
같은 라이브러리를 사용하여 불편을 해결하였습니다.
하지만 Butter knife
는 안드로이드 고유의 기능이 아니었고
항상 문제 없이 안전하게 사용하기에는 무리가 있었습니다.
그리고 어노테이션 작업도 귀찮았습니다.
그리고 코틀린에는 id를 바로 변수처럼 사용할 수 있는
Kotlin-Synthetic
이 있었습니다.
하지만 지금은 deprecated
되었죠..
뭐 결국은 지금 java
, kotlin
전부
view binding
을 사용하게 되었습니다.
일단 앱 단위의 build.gradle
에 들어갑니다.
android {
...
buildFeatures {
viewBinding true
}
}
위와 같이 적어줍니다.
그리고 sync
를 눌러줍니다.
뷰 바인딩을 적용하실 Activity로 간 후
아래와 같이 코드를 작성합니다.
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
위와 같이 코드를 적었다면
아래와 같이 바인딩 클래스 인스턴스를 사용하여 뷰를 참조할 수 있습니다.
binding.tvDate.setText("2022-06-01");
fragment도 비슷합니다.
private FragmentMealBinding binding;
@Override
public View onCreateView(
LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState
) {
binding = FragmentMealBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
위와 같이 작성하시면 뷰 바인딩을 사용하실 수 있습니다.
사용법은 위의 Activity와 똑같이 사용하실 수 있습니다.
binding.tvInit.setText("Hello");
저는 요즘 Data Binding
을 사용하기에 마지막으로
Data Binding
과 View Binding
의 차이를 작성하며 끝내겠습니다.
1.
View Binding
은 컴파일 시간이 더욱 짧습니다.
2.View Binding
은 xml 파일에 특별히 태그를 하지 않아도 되므로
더욱 신속하고 간편하게 사용할 수 있습니다.
뷰 바인딩, 데이터 바인딩
어느것이 더 좋다를 판별하기 보다는 자신의 상황에 맞추어서
어느것이 더 도움이 될까 생각하는 것이 더욱 코딩을 함에 있어서
좋은 코드를 짤 수 있을 것이라고 생각합니다!