1. 빌드 환경
2. 레이아웃 및 바인딩 수식
1. 빌드 환경
buildFeatures {
dataBinding = true
}
2. 레이아웃 및 바인딩 수식
일반 레이아웃을 데이터 바인딩 레이아웃으로 변환하려면:
1. 레이아웃을 <layout>태그 로 감싸세요
2. 레이아웃 변수 추가(선택 사항)
3. 레이아웃 표현식 추가(선택 사항)
- 레이아웃 표현식은 @ 기호로 시작하고 중괄호 { }로 묶습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<!-- 1. 일반적인 바인딩-->
<variable
name="firstName"
type="String" />
<variable
name="lastName"
type="String" />
<!-- 2. data 바인딩-->
<variable
name="user"
type="com.project.practice.User" />
<!-- 3. ViewModel 바인딩-->
<variable
name="viewModel"
type="com.project.practice.SimpleViewModel" />
<!-- 4. RecyclerView 바인딩-->
<variable
name="mainAdapter"
type="com.project.practice.MainAdapter" />
</data>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{firstName}"
android:textSize="30sp"
tools:text="홍" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{lastName}"
android:textSize="30sp"
tools:text="길동" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:textSize="30sp"
tools:text="홍" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:textSize="30sp"
tools:text="길동" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.username}"
android:textSize="30sp"
tools:text="liveData 값" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"좋아요 수: " + (viewModel.likeCnt != null ? String.valueOf(viewModel.likeCnt) : "0")}'
android:textSize="30sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.onLike()}"
android:text="좋아요" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:adapter="@{mainAdapter}"
android:layout_marginTop="20dp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel: SimpleViewModel by viewModels()
private lateinit var adapter: MainAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 1. 일반적인 바인딩
binding.firstName = "홍"
binding.lastName = "길동"
// 2. data 바인딩
binding.user = User("Hong", "Gil-dong")
// 3. ViewModel 바인딩
binding.lifecycleOwner = this
binding.viewModel = viewModel
viewModel.setUsername("이순신")
// 4. RecyclerView 바인딩
adapter = MainAdapter()
binding.mainAdapter = adapter
binding.recyclerViewMain.layoutManager = LinearLayoutManager(this)
val items = List(20) { "${it + 1}번째 아이템" }
adapter.submitList(items)
}
}
User.kt
data class User(val firstName: String, val lastName: String)
SimpleViewModel.kt
class SimpleViewModel : ViewModel() {
private val _username = MutableLiveData<String>()
val username: LiveData<String> get() = _username
private val _likeCnt = MutableLiveData(0)
val likeCnt: LiveData<Int> get() = _likeCnt
fun setUsername(name: String) {
_username.value = name
}
fun onLike() {
_likeCnt.value = _likeCnt.value?.plus(1) ?: 0
}
}
MainAdapter.kt
class MainAdapter : ListAdapter<String, MainAdapter.ViewHolder>(diffUtil) {
inner class ViewHolder(private val binding: ItemMainBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(string: String) {
// data binding 사용
binding.itemText = string
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemMainBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item)
}
companion object {
val diffUtil = object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
return oldItem == newItem
}
}
}
}
item_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="itemText"
type="String" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView_main_item"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="@{itemText}"
tools:text="1번째 아이템" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
참조
데이터 바인딩 라이브러리 | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소 데이
developer.android.com
Data Binding in Android | Android Developers
In this codelab you’ll learn how to use the Data Binding library. The Data Binding Library allows you to bind UI components in your layouts to data sources in your app using a declarative format rather than programmatically. You’ll learn to set it all
developer.android.com
'Dailycoding > Android' 카테고리의 다른 글
안드로이드 이미지 확대, 축소 : PhotoView 사용 (1) | 2024.09.04 |
---|---|
Room + 검색 화면 (0) | 2024.08.28 |
CoordinatorLayout (0) | 2024.08.21 |
wifi 없을 때 Room 사용해서 화면에 표현 (0) | 2024.08.19 |
shimmer library를 사용해서 스켈레톤 로딩 화면 (0) | 2024.06.11 |