요즘 주로 사용되는 Android Architecture인 MVVM Pattern에서는 Databinding이 필수적인 개념으로 사용되고 있다. 이번 포스트에서 Android Project에 Databinding을 적용하는 방법을 다뤄 볼 예정이다.
App 단위 Gradle에서 Databinding을 활성화시켜준다.
build.gradle(app)
buildFeatures {
dataBinding = true
}
이제 Databinding 을 적용할 Layout 을 구현한다.
<layout>
<data>
<variable
name="viewModel"
type="com.soulkey.project.ui.mainViewModel" />
</data>
<androidx.core.widget.NestedScrollView>
...
</androidx.core.widget.NestedScrollView>
<layout>
해당 XML의 구성을 분석해보면, 전체 Layout을 <layout>
Tag로 감싸고, 그 안에서 화면의 Root가 될 부분을 담당하는 Tag와 화면에서 사용하는 데이터를 다룰 부분을 <data>
Tag로 감싼다.
이제 화면을 담당하는 Activity를 Layout과 연결해준다.
class MainActivity : BaseActivity() {
private val binding: ActivityMainBinding by lazy {
DatabindingUtil.setContentView(this, R.layout.activity_main)
}
//Koin을 활용한 ViewModel Injection
private val mainViewModel: MainViewModel by viewModel()
}
ActivityMainBinding
은 프로젝트의 Databinding 설정에 의해 Layout을 생성하면 자동으로 생성되는 클래스이다. 이를 활용하여 DatabindingUtil
을 활용하여 화면을 연결시켜준다.
이제 binding
변수를 활용하여 Activity와 연결된 ViewModel을 전달해준다.
binding.viewModel = mainViewModel
만약 화면을 담당하는 구성요소가 Fragment라면 다음과 같이 연결한다.
class MainFragment : Fragment() {
private lateinit var binding: FragmentMainBinding
// Koin을 활용한 ViewModel Injection
private val mainViewModel: MainViewModel by sharedViewModel()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DatabindingUtil.inflate(inflater, R.layout.fragment_main, false)
binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = mainViewModel
return binding.root
}
}
이제 Layout에 ViewModel이 연결되었으니, ViewModel의 데이터를 화면에서 직접 연결해줄 수 있다.
<TextView
android:id="@+id/text_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.textData}
/>
이제 기본적은 Databinding 활용에 대해 다루어보았다. 이후에는 RecyclerView에서 Databinding을 적용해보는 예제를 다뤄볼 예정이다.