yourginieus
Data binding 본문
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도 처리함
- DataBindingUtil 클래스의 메소드인 setContentView로 수정
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()
'Android > Android Kotlin 기초 실습 정리' 카테고리의 다른 글
Navigation : Navigation components, drawer 등 (0) | 2022.10.26 |
---|---|
Fragment : fragment 생성 및 layout에 fragment 추가 (0) | 2022.10.25 |
ConstraintLayout, Chain, setBackgroundColor/Resource, 리스트의 아이템에 click handler 적용 (0) | 2022.10.25 |
User Interactivity : 사용자와 상호작용 - 키보드 보이기, 숨기기 (0) | 2022.10.25 |
LinearLayout, TextView, Scroll View, dp/sp (0) | 2022.10.25 |
Comments