본문 바로가기

모바일/안드로이드

[Android Studio] View Binding

Widget을 코드에 연결할 때 불편한 점

xml 파일에 선언된 Widget을 SetContentView를 이용해 객체를 만든 다음 findViewById 함수를 통해 변수와 연결하는 일련의 과정

 

1. 코드에서 제어 할 widget 수 만큼 findViewById 호출

2. 두 개 이상의 레이아웃 파일이 프로젝트에 존재할 경우 사용하지 않는 다른 파일의 위젯 아이디를 넣은 앱 실행 후

   Null Exception 발생 -> 컴파일 단계에서는 에러 발생 X

 

이 문제 해결을 위해 외부 라이브러리 개발 -> View Binding

 

1. Android Gradle Plugin 버전 : 3.6.0 이상인지 확인 (File -> Project Structure : Android Gradle Plugin Version)

2. build.gradle (Module:app) 파일을 열어 viewBinding 코드 추가

apply plugin: 'com.android.application'
android {
	compileSdkVersion 29
    buildToolsVersion "29.0.2"
    viewBinding.enabled=true
}

3. 파일 우측 상단의 sync now 클릭

 

 

실습

activity_main.xml -> ActivityMainBinding

MainActivity의 onCreate 수정

public class MainActivity extends AppCompatActivity { 
  private ActivityMainBinding binding;
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    binding=ActivityMainBinding.inflate(getLayoutInflater()); 
    setContentView(binding.getRoot()); 
  } 
} 
//binding 하지 않은 코드
TextView textView=findViewById(R.id.textView); 
textView.setText("Hello");

//binding 한 코드
binding.textView.setText("Hello");

따로 findViewById를 호출할 필요 없이 해당 레이아웃 id를 가진 위젯만 자식으로 등록 -> null 상황 발생 X

 

 

 

build.gradle(Module:app) 파일에 config 추가

android { 
  compileSdkVersion 29 
  buildToolsVersion "29.0.2" 
  viewBinding{ 
	  enabled = true 
  }

 

 

MainActivity.java 수정

public class MainActivity extends AppCompatActivity 
  	implements TextWatcher, View.OnClickListener, CompoundButton.OnCheckedChangeListener { 
  private ActivityMainBinding binding;
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    binding=ActivityMainBinding.inflate(getLayoutInflater()); 
    setContentView(binding.getRoot());
    initWidgets(); 
  } 
private void initWidgets(){ 
  binding.editTextName.addTextChangedListener(this); 
  binding.editTextPhone.addTextChangedListener(this); 
  binding.radioButtonAdult.setOnClickListener(this); 
  binding.radioButtonStudent.setOnClickListener(this); 
  binding.checkBoxTerms.setOnCheckedChangeListener(this); 
}