안드로이드 데이터바인딩 뷰바인딩 Databinding Viewbinding

바인딩을 안해도 안드로이드 개발에 문제없다

그럼 왜 바인딩을 하나?

일단 뷰바인딩은 findViewById 로 하나하나 변수를 선언해주는 걸 줄여준다

데이터바인딩은 xml 에서 데이터를 직접 매핑 하기에 Activity 에 있는 뷰와 관련된 로직을 줄여준다

뷰바인딩 방법

  • build.gradle 에 enable 추가
  • Activity 에서 ViewBinding 사용
  • Fragment 에서 ViewBinding 사용

build.gradle 에 enable 추가

1
2
3
4
5
6
android {
...
buildFeatures {
viewBinding = true
}
}

Activity 에서 ViewBinding 사용

activity_main.xml 의 경우

1
2
3
4
5
6
7
8
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivitymainBinding.inflate(layoutInflater)

binding.txtFirst.text = "Hello"
binding.txtSecond.text = "World"
binding.btnConfirm.setOnClickListener { /* ... */ }
setContentView(binding.root) }

Fragment 에서 ViewBinding 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class LockerFragment : Fragment() {
//(1)null binding 생성
// 이 binding은 onCreateView와 onDestroyView 사이에서만 유효
private var _binding: FragmentLockerBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
//(2) root view 가져오기
_binding = FragmentLockerBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.txtView.text = "Hello"
}
override fun onDestroyView() {
super.onDestroyView()
//(3) binding null 로 초기화
_binding = null
}
}

데이터바인딩 방법

  • build.gradle 에 enable 추가
  • xml 파일에 layout 작성
  • Activity 에서 DataBindingUtil.setContentView() 사용
  • data class 선언
  • layout 에 data 태그 추가
  • Activity 에서 layout 의 data 태그를 binding 해서 사용한다

build.gradle 에 enable 추가

1
2
3
4
5
6
adroid{
...
buildFeatures {
dataBidning = true
}
}

xml 파일에 layout 작성

1
2
3
4
5
6
7
8
9
10
11
12
<layout :android="http://schemas.android.com/apk/res/android"
...>
<androidx.drawerlayout.widget.DrawerLayout
...
android:id="@+id/drawer">
<TextView
android:id="@+id/txtName"
...
android:text="Name"/>
...
</androidx.drawerlayout.widget.DrawerLayout>
</layout>

Activity 에서 DataBindingUtil.setContentView() 사용

1
DataBindingUtil.setContentView()

data class 선언

1
2
3
4
5
data class GameData (
var img : Drawable,
var id : String,
val name : String
)

layout 에 data 태그 추가

1
2
3
4
5
6
7
8
<layout :android="http://schemas.android.com/apk/res/android"
...>

<data>
<variable
name="gamedatas"
type="com.skyksit.dsam3.GameData" />
</data>

Activity 에서 layout 의 data 태그를 binding 해서 사용한다

1
2
3
4
5
6
7
8
9
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.gamedatas = GameData("data", "binding")
}
}

참고포스트

  • 안드로이드 바인딩