우선 시작하기 전에!!
참고: 뷰 바인딩은 Android 스튜디오 3.6 Canary 11 이상에서 사용할 수 있습니다. 그러니 3.6 이상으로 업그레이드를 해주세요.
일단 gradle 에 우리가 viewbinding을 쓸 것이다 라고 알려주고
android {
...
viewBinding {
enabled = true
}
}
바로 코드를 작성하면 됩니다.
public class Map_carsharing_borrow extends AppCompatActivity {
public static String borrow_time;
public static String return_time;
public static String borrowCarName;
private int flag;
private ActivityMapCarsharingBorrowBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding =ActivityMapCarsharingBorrowBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
binding.carimageAllnewmorning.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
binding.cartypeList.setVisibility(View.GONE);
final int originWidth = binding.rootLayout.getLayoutParams().width;
binding.buttonBorrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TimePickerDialog dialog = new TimePickerDialog(Map_carsharing_borrow.this, listener, 15, 24, false);
dialog.show();
flag =0;
}
});
binding.buttonReturn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
flag =1;
}
});
}
}
코드에 대한 설명을 시작하겠습니다.
private ActivityMapCarsharingBorrowBinding binding;
이 부분이 바로 binding을 사용하겠다는 신호탄입니다. 해당 클래스는 activity_map_carsharing_borrow.xml을 가져옵니다.
하지만 binding을 하기위해 단계가 추가가 되죠. 또한 binding을 하게 되면 카멜표기법으로 알아서 변환을 해주니 알아두시면 좋습니다.
activity_map_carsharing_borrow.xml --> ActivityMapCarsharingBorrowBinding 으로 적어주시면 됩니다.
또한 원래는 아래와 같은 구조였습니다. 바로 setContentView에 넣기!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_carsharing);
...
}
하지만 binding을 하기 위해
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding =ActivityMapCarsharingBorrowBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
...
}
이런 방식으로 바꾸어야합니다.
binding 에 inflate를 하고
View view = binding.getRoot(); 을 통해 최상단 레이어를 가져와 binding하는 것입니다. 그다음에 그것을 setContent를 하기 됩니다.
이런 후에는 다음과 같은 코드를 작성할 수 있습니다.
binding.carimageAllnewmorning.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
원래라면
private Imageview carimage_allnewmorning;
...
carimage_allnewmorning = findviewbyid(R.id.carimage_allnewmorning);
이런식으로 되어야만 했었습니다. 하지만 binding을 때문에 많이 간결해졌죠. 이런 방식으로 binding.id(카멜표기법이 적용된) 을 바로 이용할 수 있게 되었습니다.
<구글이 말한 장점>
1. findViewById alternative
2. Null safety
3. Compile-time safety
4. Lighter & faster than DataBinding
<제가 느낀 장단점>
장점 :
1. binding을 하기 되면 일단 Null safety가 보장됩니다. 최소한 앱을 실행시키기전 코드단에서 없다는 것을 알 수 있기 때문입니다.
2. 단순한 선언과 findviewbyid 가 줄어듭니다. 매우 깔끔해져서 보기도 편해집니다.
단점 :
1. binding을 하게 되면 일단 코드가 늘어날때가 있습니다. fragment에서 쓰는 경우와 같은 것을 많이 불러올 경우입니다. 기존에는 한번 선언을 해놓으면 바로 사용할 수 가 있었는데 binding을 하기 되면 binding.id 라는 방식으로 써야해서 한번 더 쓰게 되는 불편함이 있습니다.
2. 앞써 말씀드린 fragment 에서는 생명주기에 따라 구분해서 써야한다는 단점이 있어 생각보다 불편했습니다.
하지만 아무리 단점이 불편해도
단점 <<<<< 장점 !!!
그러니 한번 binding 사용을 추천드립니다.
<참고>
https://medium.com/@charlezz/view-binding-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-df3526d909a7
https://developer.android.com/topic/libraries/view-binding?hl=en
'개발 > 안드로이드' 카테고리의 다른 글
[안드로이드] 공공데이터 (공적마스크_코로나) api 받아서 구글맵에 마커찍기 (2) | 2020.03.15 |
---|---|
[안드로이드] 앱 초기 로딩시 흰 화면 없애기(인트로 페이지 공백없애기) (2) | 2020.03.12 |
[안드로이드] 구글맵 커스텀 마커를 하는 2가지 방법 (0) | 2020.03.07 |
[안드로이드] 구글맵 클러스터링 커스텀 마커 표출 | 버그리포트 (0) | 2020.01.24 |
[안드로이드] 구글맵 + 마커 클러스터링 + 커스텀 마커 + 마커 클릭 이벤트 구현 (2) | 2020.01.15 |
댓글