728x90
ViewBinding
- 안드로이드 스튜디오 버전이 변경되면서 추가된 라이브러리
- 기존의 androidx를 통해 view 의 주소값을 자동으로 받아오는 것은 코틀린밖에 되지 않아 자바에서도 사용 가능하도록 추가한 라이브러리
** 자바에서 뷰의 주소값을 추출하기위해 findViewById 사용하던 것을 개선
** 뷰의 주소값을 추출하지 않고 바로 사용 가능
- 레이아웃 폴더에 있는 xml 파일들을 관리하는 클래스를 자동으로 생성해서 view를 관리할 수 있는 개념임
- 레이아웃 폴더에 있는 xml 파일 1개당 하나의 뷰 바인딩 클래스 1개가 생성, 이 클래스에 xml 파일에 배치한 view 들을 관리할 수 있는 기능이 구현되어 있고 이를 통해 view를 손쉽게 관리 가능
- ViewBinding 사용을 위해서는 app수준의 gradle 파일에 다음과 같이 추가 해 줘야한다.
// android studio 4.0 ~
buildFeatures{
viewBinding = true
}
// 최근 업데이트 되서 이렇게 바뀜
viewBinding{
enabled = true
}
1. ViewBinding 미사용 예시
2025.06.06 - [안드로이드 스튜디오] - [Android] View의 기본 개념
2. ViewBinding 사용 예시
1. Gradle Scripts - build.gradle.kts 에서 앱 수준 파일을 열고 android{} 가장 아래 코드를 추가한 뒤 syncNow 클릭
나는 이 때 Unresolved reference: enabled 라는 오류가 발생했는데 걍 예전꺼 쓰니까 오류 안남
buildFeatures{
viewBinding = true
}
2. 바인딩 객체를 얻어와서 작업한다.
public class MainActivity extends AppCompatActivity {
// viewBinding 객체를 담을 변수
// xml 파일 이름이 activity_main.xml 이면 activityMainBinding 객체를 생성
// 만약 xml 파일 이름이 test_abc.xml 이면 testAbcBinding 객체를 생성
ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
// 뷰 바인딩 객체 추출
// getLayoutInflater() : xml 파일을 가지고 뷰들을 생성하는 역활을 함
// getLayoutInflater()에서 만든 뷰의 주소값을 activityMainBinding이 가지고 있음
activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
// getRoot() : 전체를 관리하는 LinearLayout을 가지고있음
setContentView(activityMainBinding.getRoot());
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
3. 만약 xml을 하나 더 추가해서 그걸로 연결을 한다면 아래와 같이
public class MainActivity extends AppCompatActivity {
ActivitySecondBinding activitySecondBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_second);
activitySecondBinding = ActivitySecondBinding.inflate(getLayoutInflater());
setContentView(activitySecondBinding.getRoot());
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.second), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
4. 기존의 코드에서 (main) 리스너 연결하기
public class MainActivity extends AppCompatActivity {
// viewBinding 객체를 담을 변수
// xml 파일 이름이 activity_main.xml 이면 activityMainBinding 객체를 생성
// 만약 xml 파일 이름이 test_abc.xml 이면 testAbcBinding 객체를 생성
ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
// 뷰 바인딩 객체 추출
// getLayoutInflater() : xml 파일을 가지고 뷰들을 생성하는 역활을 함
// getLayoutInflater()에서 만든 뷰의 주소값을 activityMainBinding이 가지고 있음
activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
// getRoot() : 전체를 관리하는 LinearLayout을 가지고있음
setContentView(activityMainBinding.getRoot());
ButtonClickListener buttonClickListener = new ButtonClickListener();
activityMainBinding.button.setOnClickListener(buttonClickListener);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
class ButtonClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
activityMainBinding.textView.setText("버튼을 눌렀습니다");
}
}
}
728x90
'안드로이드 스튜디오' 카테고리의 다른 글
[Android] TableLayout (0) | 2025.06.09 |
---|---|
[Android] LinearLayout (0) | 2025.06.07 |
[Android] View의 기본 개념 (1) | 2025.06.06 |
[Android] 동작원리 (0) | 2025.06.06 |
[Android] 프로젝트 생성 및 AVD 테스트 (1) | 2025.06.06 |