뷰 결합(ViewBinding)기능은 findViewById
로 참조하고 형변환을 해주던 불편함을 해결해주는 편리한 기능이다.
android {
...
viewBinding{
enabled = true
}
}
뷰 결합을 사용하기 위해서는 build.gradle
에 위 코드를 선언해준다.
<LinearLayout>
<TextView android:id="@+id/textView"/>
<Button android:id="@+id/button"/>
</LinearLayout>
이 코드가 포함된 레이아웃 파일 이름이 activity_main.xml
일때 생성되는 결합 클래스의 이름은 ActivityMainBinding
이 되고 이 클래스에서는 ID값이 각각 textView
인 TextView
필드와 button
인 Button
필드가 존재한다.
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
생성된 결합 클래스에 포함된 inflate()
메서드를 호출한다.
binding.root
로 루트뷰를 가져온 뒤 setContentView()
에 전달한다.
inflate
는 '부풀게 하다' 라는 의미를 가지고있는데 Android에서 inflate()
함수는 XML파일의 코드들을 객체화해서 코드에서 사용하게 해주는 역할을 한다.
위와 같이 선언이 끝나면 이제 결합 클래스의 인스턴스를 사용해서 뷰를 참조할 수 있게된다.
binding.textView.text = "textView 필드의 text값을 넣어준다."
binding.button.setOnClickListener{
//button 클릭 이벤트를 처리해준다.
}
private var _binding: ActivityMainBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ActivityMainBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
//Fragment는 View보다 오래 지속되므로 onDestroyView()메서드로 결합 클래스 인스턴스 참조를 정리해 주어야함
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
inflate()
메서드를 호출한다.binding.root
로 루트 뷰를 호출한 뒤 onCreateView()
메서드에서 루트뷰를 반환해준다.binding.textView.text = "textView 필드의 text값을 넣어준다."
binding.button.setOnClickListener{
//button 클릭 이벤트를 처리해준다.
}
NullSafe: 뷰의 직접 참조를 생성하므로 null 포인터 예외가 발생하지 않는다.
유형 안전: 각 바인딩 클래스에 있는 필드들의 유형이 XML파일에서 참조하는 뷰와 일치하므로 클래스 변환 예외가 발생하지 않는다.
참고자료: https://developer.android.com/topic/libraries/view-binding?hl=ko#fragments