본문 바로가기
개발/안드로이드

[안드로이드] findViewById를 없애는 갓기능 : viewbinding

by 핸디(Handy) 2020. 3. 11.

우선 시작하기 전에!!

참고: 뷰 바인딩은 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

 

 

댓글