[안드로이드] 뷰 바인딩 사용하기

동현·2020년 12월 28일
0
post-thumbnail
post-custom-banner

예전에 코틀린을 사용했을 때, Kotlin Android Extension을 사용할 때 자바에서 findViewById를 일일히 안해줘도 되는 편리함이 마음에 들었었다. 그러던 중, 뷰 바인딩을 알게 되었다.

뷰 바인딩을 사용하면 다음과 같은 이점이 있다.

  1. 일일이 findViewById를 사용할 필요가 없다.
  2. Type-safe (레이아웃 내에서 정확한 view 타입을 찾아 맵핑함)
  3. Null-safe (레이아웃에 없는 id를 findViewById를 했을 때의 NullPointerException 방지)

1. build.gradle 수정

app 수준의 build.gradle에 다음 내용을 추가해주자.

android {
	...
        buildFeatures {
        viewBinding = true
    }
}

안드로이드 스튜디오의 버전이 4.0 이상이라면 위의 코드를

android {
        ...
        viewBinding {
            enabled = true
        }
    }

안드로이드 스튜디오의 버전이 3.6 이상 4.0 미만이라면 위의 코드를 추가해주자.

2. 뷰 바인딩 사용하기

<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로 화면 상의 활성 뷰로 만들면 된다.

3. 뷰 참조하기

    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번과 동일한 방식으로 하면 된다.

4. 참조

Android developers, "뷰 결합", https://developer.android.com/topic/libraries/view-binding?hl=ko

profile
https://github.com/DongChyeon
post-custom-banner

0개의 댓글