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);
}
'모바일 > 안드로이드' 카테고리의 다른 글
[Android Studio] SharedPreference (0) | 2021.04.04 |
---|---|
[Android Studio]Activity 와 Intent (0) | 2021.04.04 |
[Android Studio] 이벤트(클릭, 드래그 등) 처리 (0) | 2021.04.04 |
[Android Studio] Widget (0) | 2021.04.03 |
[Android Studio] Layout (0) | 2021.04.03 |