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함 |