데이터 바인딩이 가장 중요하다고 느껴서 따로 작성해보았다.
데이터 바인딩 외에 뷰에 대한 접근은 아래의 링크 참고~
https://ystech.tistory.com/entry/Android-View-%EC%A0%91%EA%B7%BC
[Android] View 접근
서론 보통 지금까지 개발을 하면서, Android 클래스에서 뷰에 접근하려고 할 때 findViewById 방식을 사용해 왔다. 위의 방식을 사용하면서 접근해야 할 View가 많아지면 코드의 양도 많아지고 불편했
ystech.tistory.com
데이터 바인딩이란?
- 데이터와 뷰를 연결하는 작업을 레이아웃에서 처리하는 기술
- UI Controller, ViewModel, LiveData 등과 자주 쓰이고 효과적
레이아웃은 흔히 UI 프레임워크 메서드를 호출하는 코드가 포함된 액티비티에서 정의된다. 예를 들면, 우리가 많이 사용했던 findViewById()를 호출하여 위젯을 찾아 연결하는 것이다.
데이터 바인딩은 findViewById를 사용하지 않고 레이아웃을 정의하는 xml 코드에서 데이터를 직접 넣어주는 작업이라고 보면 된다.
데이터 바인딩을 사용하면 레이아웃 파일에서 구성요소를 결합하기 때문에 액티비티에서 많은 UI 프레임워크 호출을 제거할 수 있으므로 코드가 간결해지고 앱 성능이 향상되고, 메모리 누수 및 NPE를 방지하기 때문에 유지보수 측면에서 효과적이다.
√ 데이터 바인딩의 범주 안에 뷰 바인딩이 위치하는데, 무조건 데이터 바인딩을 쓰는게 좋은가?
- 아니다 - 데이터 바인딩의 기능을 사용하지 않는다면 비교적 가벼운 뷰 바인딩을 사용하는게 성능면에서 더 좋다.
사용법
gradle(모듈)
android{
//dataBinding
buildFeatures {
dataBinding = true
}
}
xml
- 레이아웃을 <layout>으로 감싸고 아래의 형식처럼 데이터 소스 연결
<?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="user"
type="com.pys.databinding2.Person" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
/>
<TextView
android:id="@+id/textAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{Integer.toString(user.age)}"
/>
<TextView
android:id="@+id/textEx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Btn"
android:onClick="myClick"
/>
</LinearLayout>
</layout>
데이터 바인딩을 통해 데이터를 넣을 때는 @{} 형식으로 작성한다.
데이터 바인딩을 통해 android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}" 이런식으로도 작성 가능하다.
Data Class
package com.pys.databinding2
data class Person (
val name : String,
val age : Int
)
Activity
package com.pys.databinding2
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.databinding.DataBindingUtil
import com.pys.databinding2.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
//데이터 결합을 위해 데이터 바인딩 활용
private lateinit var binding : ActivityMainBinding
var testCount = 20
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 기존의 방법
binding.textV.text = "변경"
// 데이터 결합
val person = Person("동동이", 26)
}
fun myClick(view : View) {
testCount++
val person = Person("동동이", testCount)
binding.user = person
}
}
느낀점
사실 아직까지도 뷰에 접근하는 방식은 findViewById가 편하다. Android를 공부해온 몇년동안 위 방법만 사용했으니 당연하다고 생각한다.
하지만, 코드의 간결함이나 유지보수 측면에서 데이터 바인딩이 기존 방식보다 좋은점이 있기에 앞으로 활용해보려한다.
참고
데이터 결합 라이브러리 | Android 개발자 | Android Developers
컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선
developer.android.com
[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin) - 인프런 | 강의
코틀린으로 안드로이드 개발을 위한 젯팩(JETPACK) 개론입니다. 안드로이드 개발을 하면서 사용할 수 있는 다양한 테크닉을 연습할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com