Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

yourginieus

Data binding 본문

Android/Android Kotlin 기초 실습 정리

Data binding

EOJIN 2022. 10. 25. 21:07

Data binding

  • 이전까지는 findViewById() 를 이용해 뷰에 대한 참조를 가져 옴
  • 뷰를 생성하거나 재생성한 후, 이를 검색하기 위해 매번 findViewById를 사용하면 매번 view hierarchy를 탐색해야 함
  • 앱의 뷰 수가 적은 경우에는 문제가 되지 않지만 여러 뷰가 있을 때는 문제가 됨
  • view를 variable에 캐싱하면 도움이 되지만, 이 역시 모든 뷰에 대해 각각 변수를 초기화해줘야 함
  • 한 가지 해결책 -> 각 뷰에 대한 reference를 포함하는 object 만들기! = Binding
    • Binding object는 앱 전체에서 사용할 수 있음
    • 이러한 기술이 data binding !!
    • 바인딩 개체가 앱에서 한 번 생성되면, view hierarchy를 탐색하거나 data를 검색할 필요 없이 이 바인딩 개체를 통해 view들과 data에 access할 수 있음!

Benefits of Data binding

  • findViewById() 를 사용하는 것보다 코드가 짧고 읽기 쉬우며, 유지보수에 용이함
  • Data와 view가 명확하게 분리됨
  • Android system은 각 뷰를 얻기 위해 view hierarchy를 한 번만 탐색하며, app을 사용 중인 중간이 아닌 앱 시작 중에 발생함
  • view에 accessing하기 위한 type safety를 얻을 수 있음(컴파일러가 컴파일 중에 타입을 검증하는 것. 잘못된 타입을 변수에 할당하려고 하면 에러가 발생함)

STEP 1 : Data binding 활성화

  • 데이터 바인딩을 사용하려면 Gradle 파일에서 data binding을 활성화해야 함 - 기본값은 비활성화 상태임! data binding이 컴파일 시간 및 앱 시작 시간에 영향을 미치기 때문
  • build.gradle(Module:app) 파일에서
  • android 섹션의 닫힘 괄호 앞에 buildFeatures 섹션을 추가하고 dataBinding을 true로 설정
buildFeatures {
    dataBinding true
}
  • Sync 하기

STEP 2 : Layout 파일을 data binding을 함께 사용할 수 있도록 변경

  • data binding을 사용하려면, layout xml 파일을 <layout> 태그로 감싸줘야 함
  • root class가 view group이 아닌 view group 및 view를 포함하는 layout이 됨을 의미!
  • 이렇게 해야 binding object가 layout과 layout 내의 view를 알 수 있음
<layout>
   <LinearLayout ... >
   ...
   </LinearLayout>
</layout>

**코드 들여쓰기를 수정하려면 Code > Reformat code 클릭

  • layout에 대한 namespace 선언은 가장 바깥족 태그에 있어야 함
    • <LinearLayout> 에서 namespace를 잘라내어 <layout> 태그에 붙여 줌
<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">

STEP 3 : MainActivity에서 binding object 생성

  • main activity에 binding object에 대한 reference를 추가하여, view에 access 할 수 있도록 함
  • MainActivity.kt를 열고
  • onCreate() 전, 즉 top level에 binding object를 위한 variable 생성 -> binding이라고 이름 붙임
  • binding의 타입으로는 ActivityMainBinding 클래스를 붙여 줌
    • main activity 전용으로 컴파일러가 생성해주는 클래스 -> 다른 액티비티도 생기며, 레이아웃파일의 이름+Binding으로 이름지어짐
private lateinit var binding: ActivityMainBinding
  • onCreate() 안의 setContentView()를 수정함
    • DataBindingUtil 클래스의 메소드인 setContentView로 수정
      • activity_main과 MainActivity를 연결짓는 클래스
      • 여기의 setContentView()는 view에 대한 일부 data binding setup도 처리함
binding = DataBindingUtil.set Content View(this, R.layout.activity_main)

STEP 4 : Binding object를 활용하여 findViewById() 대체하기

  • 바인딩 오브젝트가 생성되면 컴파일러는 바인딩 오브젝트 내부의 view들에 대한 이름을 생성함
    • layout내의 view의 ID에 따름
    • 그 ID를 camel case로 바꿔서 name을으로 취급함
    • findViewById<Button>(R.id.done_button)binding.doneButton 으로 바뀌는 것!

Data binding을 사용하여 Data 표시

  • 데이터 바인딩을 사용하여 view에서 바로 data class를 사용할 수 있음

STEP 1 : Data Class 만들기

  • 원하는 형태의 Data class 만들기
  • Android Studio에서 java 디렉토리 안에 Data class 형태의 파일 생성 후
  • 원하는 형태로 형식 지정해 줌
data class MyName(
    var name: String = "", 
    var nickname: String = ""
)

STEP 2 : Layout에 data 추가

  • 레이아웃의 맨 위에 있는 <layout> 과 <LinearLayout> 태그 사이에 <data></data> 태그 삽입
  • 여기서 뷰와 데이터를 연결할 것
<data>
  
</data>
  • data 태그 네에서 클래스에 대한 reference를 유지하는 변수를 선언할 수 있음
  • <data> 태그 내부에 <variable> 태그 추가
  • name 파라미터: variable에게 이름 부여
  • type 파라미터 : data class가 위치한 full qualified name 설정 (package name + variable name)
<variable
       name="myName"
       type="com.example.android.aboutme.MyName" />
  • 기존의 textView의 text를 바꾸는 상황이라면, text 속성을 수정
    • @={ } 는 중괄호 안에서 참조되는 데이터를 취득하는 명령어
    • 원하는 데이터를 중괄호 안에 넣은 후 text로 지정
android:text="@={myName.name}"

STEP 3 : Data 생성

  • 이제 레이아웃 파일의 데이터를 참조할 수 있음!
  • 이제는 실제 데이터 생성할 차례
  • MainActivity.kt 열고
  • onCreate() 바로 위에 private variable 만들기 : 보통 layout에서 설정한 variable과 같음
  • 이 private variable은 위에서 사용한 data class의 instance로 할당!
private val myName: MyName = MyName("Aleks Haecky")
  • onCreate 안에서 myName의 값 설정
    • layout 파일 안의 variable의 값을 내가 지금 선언한 variable의 값으로 지정하기
    • xml 안에서 직접 액세스할 수는 없고, 바인딩 개체를 통해 액세스해야 함
binding.myName = myName
  • 그리고 이제는 이 kt 파일 내의 myName의 값을 건드리면 됨
//레이아웃에 이걸 추가하고
android:text="@={myName.nickname}"
myName?.nickname = nicknameEdit.text.toString()
  • binding object가 업데이트 된 후 UI를 그 업데이트 된 데이터들로 refresh하고 싶다면, invalidateAll() 사용
binding.apply {
   myName?.nickname = nicknameEdit.text.toString()
   invalidateAll()
   ...
}

  • editText 값을 TextView 값으로 가져오기
    • TextView는 string을 원하지만 EditText 는 Editable 타입입므로, 해당 데이터를 가져오려면 명시적으로 toString을 사용해야 함
binding.nicknameText.text = binding.nicknameEdit.text.toString()

 

https://developer.android.com/codelabs/kotlin-android-training-data-binding-basics?index=..%2F..android-kotlin-fundamentals&hl=ko#0 

 

Comments