ViewBinding이나 DataBinding을 사용하기 전에는 Activity, Fragment findViewById()를 사용해 view의 id를 찾아주었다.
그런데 이렇게 하면 view가 많아지면 코드가 길어지고 id를 잘못 쓰면 오류가 나고.. 여러모로 불편했다.
학교 수업을 들을 때는 findViewById()만 사용했는데 여러 플젝을 진행하면서 이렇게 편리한 방법이 있는걸 알았다!
처음에 공부하면서 블로그에 정리해서 올려야지~ 했는데.. 귀찮아서 미루다가 이제서야 정리한다..ㅎㅎ🫣
build.gradle 파일에 해당 코드 추가
android {
...
viewBinding {
enabled = true
}
}
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding // onCreate()에서 초기화하기 위해 lateinit으로 선언
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewBinding 객체 초기화
// inflate()는 xml에 있는 view를 객체화 해주는 역할
// 객체화 해주는 과정에서 layoutInflater가 필요
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) // 레이아웃을 inflating 해줌
}
}
class MainFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val binding = FragmentSettingBinding.inflate(inflater, container, false)
return binding.root
}
}
binding.textView.text = "Hello, World!" // TextView에 텍스트 설정
UI 요소와 데이터를 프로그램적 방식으로 연결하지 않고, 선언적 형식으로 결합할 수 있게 도와주는 라이브러리
build.gradle 파일에 해당 코드 추가
android {
...
dataBinding {
enabled = true
}
}
User.kt
class User {
val name: String,
val age: String,
}
activity_main.xml
<layout> 태그로 감싸줘야 한다.
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="user" // 레이아웃에서 사용할 변수 이름 (직접 지정)
type="com.example.android-study" /> // xml과 연결될 데이터 (변수 타입)
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" // 변수 사용
/>
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.age}" />
</LinearLayout>
</layout>
MainActivity.kt
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.user = User("apeach", "5") // xml에서 만든 user 변수에 접근
}
}
| ViewBinding | DataBinding |
|---|---|
| 단방향 바인딩 (양방향 바인딩 지원 X) | 양방향 바인딩 |
| 속도가 더 빠르고 효율적임 | 빌드 시간이 보다 오래 걸리고 코드 구현이 어려움 |
| 태그를 사용하지 않고 자동으로 모든 layout에 대해 binding class가 생성 | 태그를 사용해 binding class 를 생성, TAG를 삽입 |
| 코드에 view를 binding | view를 binding 하는 것뿐만 아니라 data를 직접 view에 binding함 |