처음 안드로이드를 공부 할 때 기능 구현에만 급급하던 시절(지금도 마찬가지지만) xml의 뷰와 변수를 연결시켜주기 위해서 findViewById 라는 글루코드를 일일이 작성했었다.
하지만 ViewBinding을 사용하면 이러한 귀찮은 과정을 생략할 수 있기에 공부하고자 한다.
모듈에 뷰 결합을 사용하도록 설정되면 모듈에 포함된 각 XML 레이아웃 파일의 결합 클래스가 생성된다. 결합 클래스의 이름은 XML 파일의 이름을 카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성된다. ex) layout : activity_main.xml, 결합 클래스 :ActivityMainBinding
result_profile.xml
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
생성된 결합 클래스 이름 : ResultProfileBinding
모든 결합 클래스에는 레이아웃 파일의 루트 뷰를 제공하는 getRoot() 메서드가 포함된다.
Activity에서 ViewBinding 사용
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
결합 클래스 인스턴스를 사용하여 뷰를 참조가능
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
프래그먼트에 사용할 결합 클래스 인스턴스를 설정하려면 프래그먼트의 onCreateView() 메서드에서 다음과 같이 진행한다.
fragment_home.xml
<androidx.constraintlayout.widget.ConstraintLayout..>
<TextView
android:id="@+id/test"
android:layout_width="190dp"
android:layout_height="80dp"
android:background="@drawable/tx_home"
app:layout_constraintEnd_toEndOf="@id/constraint1"
app:layout_constraintStart_toStartOf="@id/constraint1"
app:layout_constraintTop_toTopOf="@id/constraint1" />
</androidx.constraintlayout.widget.ConstraintLayout>
HomeFragment
class HomeFragment : Fragment() {
private lateinit var hBinding: FragmentHomeBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
hBinding = FragmentHomeBinding.inflate(inflater, container, false)
hBinding.test.text = "view binding"
return hBinding.root
}
}
참고자료
https://developer.android.com/topic/libraries/view-binding?hl=ko