728x90
반응형
뷰 바인딩(View Binding)
뷰 바인딩은 XML 레이아웃 View와 상호작용하는 코드를 더 쉽게 참조 할 수 있도록 하는 기능이다.
뷰 바인딩을 이용하면 findViewById()를 사용할 필요 없이 자동으로 View Id를 가져올 수 있다.
뷰 바인딩을 사용하는 이유
1. findViewById()보다 간편하고 안전하다
- findViewbyId()는 뷰 ID를 잘못 입력해도 컴파일 시 오류가 발생하지 않아서 앱 실행 중 크래시 가능성이 있다.
- 뷰 바인딩은 컴파일 시 뷰 ID를 확인하므로 오류를 미리 방지 할 수 있다.
2. Null 안전성
- findViewById()로 찾은 뷰는 null이 될 가능성이 있다.
- 하지만 뷰 바인딩을 사용하면 null이 될 가능성이 없다.
3. 간결한 코드
- findViewById()를 여러 번 사용할 필요 없이, 바로 binding 객체를 통해 뷰를 조작할 수 있다.
View Binding 설정
1. gradle 설정
뷰 바인딩은 안드로이드 3.6 이하 버전에서는 적용되지 않는다.
// 안드로이드 스튜디오 4.0 이상
android {
....
buildFeatures {
viewBinding = true
}
}
// 안드로이드 스튜디오 3.6 ~ 4.0
android {
....
viewBinding {
enbaled true
}
}
2. xml 설정
바인딩 클래스를 생성하는 동안 레이아웃 파일을 무시하려면 아래 속성을 root view에 추가할 수 있다.
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
3. Activity 설정
- 기존 findViewById 사용
- 해당 방식은 뷰 ID를 잘못 입력해도 앱이 실행 될 때까지 오류를 알 수 없다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView = findViewById<TextView>(R.id.textView)
textView.text = "Hello, ViewBinding!"
}
}
- 뷰바인딩 적용 방식
- findViewById() 없이 바로 binding.textView로 뷰 조작이 가능하다.
- 타입 캐스팅이 필요가 없다 (findViewById<TextView>() 불필요)
- 컴파일 시 뷰 ID를 체크하므로 오류 방지.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding // 바인딩 객체 선언
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 바인딩 객체 초기화
setContentView(binding.root) // 루트 뷰 설정
binding.textView.text = "Hello, ViewBinding!" // XML 뷰 직접 참조
}
}
4. 프래그먼트에서 뷰 바인딩 설정
- 프래그먼트에서는 onDestoryView()에서 뷰 바인딩을 해제해야 한다.
- 프래그먼트는 View 보다 생명주기가 길기 때문에 메모리 누수 방지를 위해 binding을 null로 설정해야 한다.
class MyFragment : Fragment() {
private var _binding: FragmentMyBinding? = null
private val binding get() = _binding!! // Null Safety
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentMyBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textView.text = "Hello, Fragment ViewBinding!"
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 메모리 누수 방지
}
}728x90
반응형
'개발 > kotlin' 카테고리의 다른 글
| [kotlin] 로또번호 랜덤 생성기 - 3 (Activity 작업) (3) | 2025.05.29 |
|---|---|
| [Kotlin] 로또번호 랜덤 생성기 - 2 (Layout 파일 생성) (1) | 2025.05.13 |
| [Kotlin] Data Class (0) | 2025.04.18 |
| [Kotlin] tools:ignore="UselessParent" (0) | 2025.02.03 |
| [Kotlin] 로또번호 랜덤 생성기 - 1(프로젝트 생성) (0) | 2025.01.20 |