처음 안드로이드를 학습할 때 보통 findViewById()를 사용해 일일이 view 요소의 id를 가져왔다. 이 방식은 view 요소가 많아지면 findViewById() 호출 횟수가 늘어나 코드의 길이가 증가하며 id를 잘못 입력하면 NullPointer 에러가 발생할 수 있다.
val txt1 = findViewById<TextView>(R.id.tv_1)
// Activity
private var _binding: ActivityViewBindingBinding?= null
private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = ActivityViewBindingBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.tvViewBinding.text = "success"
}
DataBinding은 xml에서 view에 직접 데이터를 할당하기 위해 사용하는 Android Jetpack 라이브러리의 구성 요소이다.
// Activity
class DataBindingActivity : AppCompatActivity() {
private lateinit var binding : ActivityDataBindingBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding)
binding.dataBinding = DataBindingModel("Data Binding Text")
}
}
data class DataBindingModel(
val stringData: String
)
<-- xml -->
<layout>
<data>
<variable
name="data_Binding"
type="com.example.binding.DataBindingModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".DataBindingActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@{data_Binding.stringData}"
android:gravity="center"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
ViewBinding과 DataBinding의 차이는 무엇일까요?
ViewBinding은 Actvity또는 Fragment(코드)에서 xml의 view를 참조하기 위해 사용하며,
DataBinding은 xml에서 view에 직접 데이터를 할당하기 위해 사용한다.