본문 바로가기
깡샘 코틀린

06-4 뷰 바인딩

by 농농씨 2023. 6. 17.

뷰 바인딩(view binding)

레이아웃 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하는 방법이다

 

안드로이드는 UI를 구성할 때 대부분 레이아웃 XML 파일을 이용한다. 레이아웃 XML파일에 등록한 뷰는 findViewByID() 함수로 얻어서 사용해야 한다.(06-2 참조) 그런데 이 작업은 꽤 귀찮다. 한 화면을 구성하는 데만도 많은 뷰가 필요하고, 또 뷰는 대부분 코드에서 이용한다. 따라서 코드에서 뷰 객체를 선언하고 모두 findViewById() 함수로 하나하나 가져와야 한다. 그래서 개발자들은 생각했다.

"액티비티에서 findViewById()함수를 이용하지 않고 레이아웃 XML 파일에 등록된 뷰 객체를 쉽게 사용할 수는 없을까?"

이를 위해 butterknife라는 라이브러리도 등장했었는데 이제는 그런 라이브러리 도움 없이도 코드에서 레이아웃 XML에 선언한 뷰를 쉽게 이용할 수 있다. 라이브러리보다 코드도 훨씬 더 간결하다.

 

뷰를 레이아웃 XML에 선언했을 때, 선언한 뷰를 코드에서 id값으로 얻어서 사용할 수도 있따. 그런데 뷰 바인딩 기법을 이용하면 코드에서 훨씬 더 간편하게 뷰 객체를 이용할 수 있다.

우선 뷰  바인딩을 사용하려면 그래들 파일에 다음처럼 선언해야 한다.

// 그래들 파일에 뷰 바인딩 설정
android {
	(... 생략 ...)
    viewBinding {
    	enabled = true
    }
}

build.gradle 파일을 열고 android 영역에 buildFeatures를 선언한다. 그리고 그 안에 뷰 바인딩을 적용하라는 의미로 viewBinding = true를 설정한다. 이렇게 하면 레이아웃 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어진다. 즉, 우리가 직접 코드에서 뷰를 선언하고 findViewById() 함수를 호출하지 않아도 이를 구현한 클래스가 자동으로 만들어지므로 이 클래스를 이용해 뷰를 사용하기만 하면 된다.

자동으로 만들어지는 클래스의 이름은 레이아웃 XML 파일명을 따른다. 첫글자는 대문자, 밑줄(_)은 빼고, 뒤에오는 단어 첫글자는 대분자, 그리고 'Binding'을 추가한다.

ex. activity_main.xml ➡️ ActivityMainBinding

 

자동으로 만들어진 클래스의 inflate() 함수를 호출하면 바인딩 객체를 얻을 수 있다. 이때 인자로 layoutInflater를 전달한다. 그리고 바인딩 객체의 root 프로퍼티에는 XML의 루트 태그 객체가 자동으로 등록되므로(?) 액티비티 화면 출력setContentView() 함수에 binding.root를 전달하면 된다. 

// 바인딩 객체 이용법
class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savvedInstanceState)
        
        // 아마 그래들 파일에서 buildFeatures도 선언되고 viewBinding = true도 선언돼서
        // 레이아웃 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어졌을 거임
        
        // 바인딩 객체 획득(자동으로 만들어진 클래스의 inflate()함수 호출함으로써)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        // 액티비티 화면 출력
        setContentView(bindng.root)
        
        // 뷰 객체 이용
        binding.visibleBtn.setOnClickListener {
        	binding.targetView.visibility = View.VISIBLE
        }
        binding.invisibleBvtn.setOnClickListener {
        	binding.targetView.visibility = View.INVISIBLE
        }
    }
}

바인딩 객체에 등록된 뷰 객체명은 XML 파일에 등록한 뷰의 id값을 따른다. 즉, XML에 뷰를 <Button android:id="@+id/visibleBtn" /> 처럼 등록했다면 바인딩 객체에 visibleBtn이라는 프로퍼티명으로 등록된다. 따라서 코드에서는 binding.visibleBtn으로 이용하면 된다.

그런데 build.gradle 파일에 뷰 바인딩을 이용하겠다고 선언하면 레이아웃 XML 하나당 바인딩 클래스가 자동으로 만들어지는데, 이때 어떤 레이아웃 XML 파일은 바인딩 클래스로 만들 필요가 없을 수도 있다. 이때 XML 파일의 루트 태그에 tools:viewBindingIgnore="true"라는 속성을 추가한다. 이 속성을 추가하면 해당 XML 파일을 위한 바인딩 클래스를 만들지 않는다

// 바인딩 생략 속성
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
    (... 생략 ...)
    tools:viewBindingIgnore="true">

'깡샘 코틀린' 카테고리의 다른 글

07-2 상대 위치로 배치 - RelativeLayout  (0) 2023.06.19
07-1 선형으로 배치 - LinearLayout  (0) 2023.06.19
06-3 기본적인 뷰 살펴보기  (1) 2023.06.17
06-2 뷰 클래스  (0) 2023.06.15
06-1 화면을 구성하는 방법  (2) 2023.06.15