본문 바로가기
안드로이드 자바

[Java][Android] viewBinding 사용하기

by teamnova 2023. 1. 15.

안녕하세요. 이번시간에는 viewBinding에 대해서 소개하겠습니다.

viewBinding = view + binding 

bind는 사전적으로 묶다, 곤경, 감다의 뜻이 있습니다.

여기서는 to tie or wrap (something) with rope, string, etc. 의 뜻으로  사용되어

안드로이드의 View 들을 묶었다고 생각하고 공부를 하는게 좋을 것 같네요.

 

View binding is a feature that allows you to more easily write code that interacts with views. Once view binding is enabled in a module, it generates a binding class for each XML layout file present in that module. An instance of a binding class contains direct references to all views that have an ID in the corresponding layout.

In most cases, view binding replaces findViewById.

 

안드로이드 개발자 페이지의 내용입니다.

왜 findViewById 를 대체하려고 했을까요?!

findViewById -  메서드overide
findViewById 추상메서드 (In AppCompatDelegate)

메서드의 주석의 내용은 다음과 같습니다.

onCreate에서 처리된 XML에서 id 특성으로 식별된 View를 찾습니다.
반환: View가 발견된 경우 View를 리턴, 그렇지 않은 경우 null입니다.

 

null이 발생할 경우가 있는지 확인해 보곘습니다.

다음과 같이 해당 xml 의 파일의 존재하지 않은 activity_sub.xml 에 있는 View를

Resources 클래스인 R를 통해 참조 할 수는 있지만,

액티비티의 인플레이트 된 xml 레이아웃에는 해당 view의 id를 찾을 수 없으므로 null을 반환하게 됩니다.

 

하지만 viewBinding을 사용한다면 해당 xml과 바인딩된 객체변수를 통해서 접근하기 때문에

null을 발생하던 activity_sub.xml 에 요소들을 참조할 수 없습니다.

따라서 null을 방지할 수 있습니다.  

 

기존 코드

public class MainActivity extends AppCompatActivity {
    TextView textView;
    EditText editText;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=findViewById(R.id.tv_text_view);
        editText=findViewById(R.id.et_edit_text);
        imageView=findViewById(R.id.iv_image_view);
        
        textView.setText("setText");
        editText.setText(R.string.app_name);
        imageView.setImageResource(R.drawable.ic_launcher_foreground);
    }
}

viewBinding 

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding=ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        binding.tvTextView.setText("setText");
        binding.etEditText.setText(R.string.app_name);
        binding.ivImageView.setImageResource(R.drawable.ic_launcher_foreground);
    }
}

또한 다음과 같이 코드의 양도 줄일 수 있습니다.

더 많은 뷰를 사용할 때, 좀 더 편하게 사용 할 수있을 것 같습니다.

 

참조 : 

https://developer.android.com/topic/libraries/view-binding

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정

developer.android.com

 

https://developer.android.com/reference/android/view/View#findViewById(int) 

 

View  |  Android Developers

 

developer.android.com