[Android] ViewBinding

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