뷰 바인딩이란
레이아웃 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하는 방법
안드로이드는 UI 구성 시 대부분 레이아웃 XML 파일 이용
레이아웃 XML 파일에 등록한 뷰는 findViewById() 함수로 얻어서 사용해야 함
근데 이 작업은 꽤 귀찮다. 한 화면을 구성하는 데만도 많은 뷰가 필요하고, 또 뷰는 대부분 코드에서 이용하기 때문에 코드에서 뷰 객체를 선언하고 모두 findViewById() 함수로 하나하나 가져와야 함
뷰 바인딩 : findViewById() 함수를 이용하지 않고 레이아웃 XML 파일에 등록된 뷰 객체를 쉽게 이용
activity_main.xml에 선언한 뷰
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/visibleBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="visible"/>
<TextView
android:id="@+id/targetView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hello world"
android:background="#FF0000"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/invisibleBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="invisible"/>
</LinearLayout>

위 코드에서 선언한 뷰 3개를 코드에서 id값으로 얻어서 사용 가능
그런데 뷰 바인딩 기법 사용 시 코드에서 훨씬 더 간편히 뷰 객체 이용 가능
우선 뷰 바인딩을 사용하려면 그래들 파일에 다음처럼 선언
그래들 파일에 뷰 바인딩 설정
안드로이드 버전에 따라 코드가 다름
android{
//(...생략...)
// Android 3.6 ~ 4.0
viewBinding {
enabled = true
}
// Android 4.0 ~
buildFeatures{
viewBinding = true
}
}
이렇게 하면 레이아웃 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어짐
이 클래스를 이용해 뷰를 사용하기만 하면 됨
자동으로 만들어지는 클래스의 이름 : 레이아웃 XML 파일명을 따름
- activity_main.xml -> ActivityMainBinding
- item_main.xml -> ItemMainBinding
자동으로 만들어진 클래스의 inflate() 함수를 호출하면 바인딩 객체를 얻을 수 있음
이때 인자로 layoutInflater 전달
그리고 바인딩 객체의 root 프로퍼티에는 XML의 루트 태그 객체가 자동으로 등록되므로 액티비티 화면 출력은 setContentView() 함수에 binding.root를 전달하면 됨
바인딩 객체 이용법
package com.asiae.viewbindingex
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.asiae.viewbindingex.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 바인딩 객체 획득
val binding = ActivityMainBinding.inflate(layoutInflater)
// 액티비티 화면 출력
setContentView(binding.root)
// 뷰 객체 이용
binding.visibleBtn.setOnClickListener{
binding.targetView.visibility = View.VISIBLE
}
binding.invisibleBtn.setOnClickListener {
binding.targetView.visibility = View.INVISIBLE
}
}
}
바인딩 객체에 등록된 뷰 객체명은 XML 파일에 등록한 뷰의 id 값을 따름
즉, XML에 뷰를 <Button android:id="@+id/visibleBtn"/>처럼 등록했다면 바인딩 객체에 visibleBtn이라는 프로퍼티명으로 등록됨. 따라서 코드에서는 binding.visibleBtn으로 이용하면 됨
avd실행결과
visible 버튼 클릭 시 hello world 보임

invisible 버튼 클릭시 hello world 사라짐

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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
새로 배운 점
안드로이드 버전마다 그래들에 viewBinding을 선언하는 방식이 다르다!
'Android, Kotlin 📱 > [kotlin]깡샘의 안드로이드 앱 프로그래밍 with 코틀린' 카테고리의 다른 글
[깡샘코틀린] 1-3 앱 실행하기 (1) | 2023.10.31 |
---|---|
[깡샘코틀린] 1-2 첫 번째 앱 만들기 (0) | 2023.10.31 |
[깡샘코틀린] 1-1 안드로이드 스튜디오 설치하기 (0) | 2023.10.31 |
[깡샘코틀린] 18-2 HTTP 통신하기(Retrofit2 라이브러리) (0) | 2023.10.30 |
[깡샘코틀린] 6-2 뷰 클래스 (0) | 2023.10.25 |
뷰 바인딩이란
레이아웃 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하는 방법
안드로이드는 UI 구성 시 대부분 레이아웃 XML 파일 이용
레이아웃 XML 파일에 등록한 뷰는 findViewById() 함수로 얻어서 사용해야 함
근데 이 작업은 꽤 귀찮다. 한 화면을 구성하는 데만도 많은 뷰가 필요하고, 또 뷰는 대부분 코드에서 이용하기 때문에 코드에서 뷰 객체를 선언하고 모두 findViewById() 함수로 하나하나 가져와야 함
뷰 바인딩 : findViewById() 함수를 이용하지 않고 레이아웃 XML 파일에 등록된 뷰 객체를 쉽게 이용
activity_main.xml에 선언한 뷰
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/visibleBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="visible"/> <TextView android:id="@+id/targetView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="hello world" android:background="#FF0000" android:textColor="#FFFFFF"/> <Button android:id="@+id/invisibleBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="invisible"/> </LinearLayout>

위 코드에서 선언한 뷰 3개를 코드에서 id값으로 얻어서 사용 가능
그런데 뷰 바인딩 기법 사용 시 코드에서 훨씬 더 간편히 뷰 객체 이용 가능
우선 뷰 바인딩을 사용하려면 그래들 파일에 다음처럼 선언
그래들 파일에 뷰 바인딩 설정
안드로이드 버전에 따라 코드가 다름
android{ //(...생략...) // Android 3.6 ~ 4.0 viewBinding { enabled = true } // Android 4.0 ~ buildFeatures{ viewBinding = true } }
이렇게 하면 레이아웃 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어짐
이 클래스를 이용해 뷰를 사용하기만 하면 됨
자동으로 만들어지는 클래스의 이름 : 레이아웃 XML 파일명을 따름
- activity_main.xml -> ActivityMainBinding
- item_main.xml -> ItemMainBinding
자동으로 만들어진 클래스의 inflate() 함수를 호출하면 바인딩 객체를 얻을 수 있음
이때 인자로 layoutInflater 전달
그리고 바인딩 객체의 root 프로퍼티에는 XML의 루트 태그 객체가 자동으로 등록되므로 액티비티 화면 출력은 setContentView() 함수에 binding.root를 전달하면 됨
바인딩 객체 이용법
package com.asiae.viewbindingex import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import com.asiae.viewbindingex.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 바인딩 객체 획득 val binding = ActivityMainBinding.inflate(layoutInflater) // 액티비티 화면 출력 setContentView(binding.root) // 뷰 객체 이용 binding.visibleBtn.setOnClickListener{ binding.targetView.visibility = View.VISIBLE } binding.invisibleBtn.setOnClickListener { binding.targetView.visibility = View.INVISIBLE } } }
바인딩 객체에 등록된 뷰 객체명은 XML 파일에 등록한 뷰의 id 값을 따름
즉, XML에 뷰를 <Button android:id="@+id/visibleBtn"/>처럼 등록했다면 바인딩 객체에 visibleBtn이라는 프로퍼티명으로 등록됨. 따라서 코드에서는 binding.visibleBtn으로 이용하면 됨
avd실행결과
visible 버튼 클릭 시 hello world 보임

invisible 버튼 클릭시 hello world 사라짐

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" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
새로 배운 점
안드로이드 버전마다 그래들에 viewBinding을 선언하는 방식이 다르다!
'Android, Kotlin 📱 > [kotlin]깡샘의 안드로이드 앱 프로그래밍 with 코틀린' 카테고리의 다른 글
[깡샘코틀린] 1-3 앱 실행하기 (1) | 2023.10.31 |
---|---|
[깡샘코틀린] 1-2 첫 번째 앱 만들기 (0) | 2023.10.31 |
[깡샘코틀린] 1-1 안드로이드 스튜디오 설치하기 (0) | 2023.10.31 |
[깡샘코틀린] 18-2 HTTP 통신하기(Retrofit2 라이브러리) (0) | 2023.10.30 |
[깡샘코틀린] 6-2 뷰 클래스 (0) | 2023.10.25 |