일일 회고
과제 수정하고, 수정하고, 리팩토링 해보고? 하느라 하루가 훌쩍 갔다. 시간이 너무너무너무 빨리 간다.
사실 오늘 과제 정리 글을 쓰려했는데, Data Binding을 적용해 보겠다고 했다가, 오후를 다 보냈다. (오전엔 선발대 과제..ㅎㅎ) 내일은 정말 정리를 해봐야겠다.
Data Binding을 적용해보기는 했는데, 돌아가긴 돌아간다. 이게 맞는 방식인진 모르겠지만....
그런데 확실히 View에 데이터를 넣는 코드를 삭제해서 조금 더 보기 좋아진 것 같긴 하다. 더 공부해 보자....
오늘의 키워드
- Data Binding
Data Binding
viewBinding vs findViewById
findViewById는 human error의 가능성(선언할 때 잘못된 id를 넣을 수 있다.) 때문에 Null Safe 하지 않다.
-> viewBinding은 레이아웃에 대한 바인딩 클래스를 만들어 레이아웃 안의 모든 뷰를 인스턴스화시킨다.
-> 레이아웃에 아직 생성되지 않은 뷰의 참조를 얻어(null상태) 해당 뷰의 속성을 사용하려 할 때 발생하는 NPE를 방지한다는 것이다.
viewBinding은 findViewById보다 성능적으로 좋다.
-> findViewById는 ViewGroup 밑에 있는 모든 뷰들을 전부 한 번씩 순회하며 id 값을 비교한다. (트리 순회를 한다. xml이 트리구조)
->viewBinding은 바인딩 클래스에서 모든 뷰들이 미리 변환된다.
Data Binding (선언적 방식)
findViewById나 viewBinding의 경우 레이아웃을 만들고 코드 상에서 제어를 한다.
// findViewById 방식
val textview = findViewById<TextView>(R.id.textview11)
textview.text = "hi"
// viewBinding 방식
binding.textview.text = "hi"
Data Binding은 코드 상에서 뷰에 직접 데이터를 주는 방식이 아니라, xml에서 선언을 통해 데이터를 제공한다.
<TextView
android:id="@+id/title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@{searchModel.title}"
android:singleLine="true"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/thumbnail_image_view"
tools:text="123" />
위와 같이 text속성에 바로 값을 넣을 수가 있다.
코드에서 제어하나 뷰에서 제어하나 거기서 거기일 것 같은데 어떤 차이가 있는지 찾아보았다.
dataBinding은 viewBinding과 동일하게, 뷰를 직접 참조하는 바인딩 클래스를 생성한다.
viewBinding이 더 빠른 컴파일 속도와 태그처리된 xml을 사용할 필요는 없지만, dataBinding은 xml에서 직접 표현식을 넣을 수 있어 동적인 UI를 만들 수 있고, 클래스 - 변수에서 세팅할 값들이 없기 때문에 View에 대한 의존성이 낮아진다고 한다. 그리고 표현식이 바뀌면 알아서 view의 값도 변경된다고도 한다. recyclerView에서도 itemView에 대해 각각 데이터를 작성해 주는 것이 아니라 xml에서 표현식만 넣어주면 값이 알아서 들어가게 된다.
등등 여러 가지 차이점 및 장점이 있는데, 각자의 장점이 있기 때문에 적절히 맞춰가며 사용하면 될 것 같다.
사용법 (Activity 기준)
1. viewBinding처럼 앱 수준의 build.gradle에서 dataBinding 요소를 추가한다.
// android studio 3.6 ~ 4.0
dataBinding {
enabled true
}
// android studio 4.0 ~
buildFeatures {
dataBinding true
}
2. xml 파일에 <layout> 태그를 작성한다.
(최상위 레이아웃에서 alt + enter를 누르고 convert to data binding layout을 누르면 바로 적용할 수 있다.)
3. Activity에서 기존의 setContnetView() 함수를 DataBindingUtil.setContentView()로 교체한다.
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
setContentView(binding.root)
4. View에 보여줄 data class를 선언한다.
// ex)
data class Model(
val thumbnailUrl: String?,
val title: String?,
val dateTime: Date?
)
5. <layout> 태그 안에서 <variable>이란 태그를 추가한다. 데이터와 뷰를 연결시켜 주는 태그이다.
<data>
<variable
name="saveModel"
type="com.sparta.imagesearch.data.model.Model" />
</data>
<TextView
android:id="@+id/title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{saveModel.title}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/thumbnail_image_view" />
'name' 속성은 xml, Activity(fragment) 파일 내에서 사용할 이름이고, type은 데이터가 선언된 경로, 즉, Model의 경로이다.
그리고, 데이터가 들어갈 뷰에 "@{}" 기호를 통해 model의 속성을 넣어주면 된다.
)
(보통, mvvm구현에서 사용되면 viewModel과 LiveData가 많이 쓰인다.)
6. Activity에서 앞에서 정의한 XML의 <data>의 <variable>의 name을 binding 한다.
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.saveModel = Model("www.abas.asd.com", "hi", Date().now())
}
}
리사이클러뷰의 같은 경우에는 ViewHolder에 모델을 통째로 넣어주면 다른 선언 없이 한 번에 바인딩을 시킬 수 있다.
(코드 라인 수 감소)
inner class SaveViewHolder(
private val binding: ItemBookmarkBinding,
) :
RecyclerView.ViewHolder(binding.root) {
fun bind(model: IntegratedModel) = with(binding) {
saveModel = model
executePendingBindings()
}
}
ref.
'내일배움캠프 7기 > TIL' 카테고리의 다른 글
내일배움캠프 7기 Android TIL 49일차 (2023.09.21) (0) | 2023.09.21 |
---|---|
내일배움캠프 7기 Android TIL 48일차 (2023.09.20) (3) | 2023.09.20 |
내일배움캠프 7기 Android TIL 46일차 (2023.09.18) (0) | 2023.09.18 |
내일배움캠프 7기 Android TIL 45일차 (2023.09.15) (0) | 2023.09.15 |
내일배움캠프 7기 Android TIL 44일차 (2023.09.14) (0) | 2023.09.14 |