Android - View/Data binding (+ 문제점들)

2022. 4. 6. 10:00IT/안드로이드

반응형

https://developer.android.com/codelabs/basic-android-kotlin-training-tip-calculator?hl=ko&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-2-pathway-1%3Fhl%3Dko%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-tip-calculator#2 

 

팁 계산  |  Android 개발자  |  Android Developers

이 Codelab에서는 팁 계산기 앱을 위한 코드를 작성합니다.

developer.android.com

 

 UI에 있는 값을 불러오기 위해서는 view 객체에 할당된 각각의 id를 호출해 값을 갖고와야하는데, 

거기서 사용되는것이 findViewById() 이다. 근데 이걸 매번 앞에 붙여서 id 값을 호출하기에는 넘 번거롭다.

그래서 대체하는것이 View Binding이다. 

  1. 앱의 build.gradle 파일을 연다. (Gradle Scripts > build.gradle (Module: *****.app)).
  2. android 섹션에서 다음 줄을 추가.
buildFeatures {
    viewBinding = true
}

3. 'Gradle files have changed since last project sync.'라는 메시지에 주의하고, Sync Now를 눌러 반영한다.

그리고 MainActivity.kt로 이동한다.

package com.example.tiptime

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.tiptime.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    // lateinit - 변수를 사용하기전에 먼저 초기화 할 것임을 확인하는 것.
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // binding 객체를 초기화 하는것.
        binding = ActivityMainBinding.inflate(layoutInflater)
        //setContentView(R.layout.activity_main)
        // 활동할 Contents View를 설정한다. 위의 레이아웃 리소스 ID인 R.layout.activity_main을 전달하는 대신,
        // App의 View 계층 구조 root인 binding.root 를 지정한다.
        setContentView(binding.root)
    }
}

AppCompatActivity 함수를 위와 같이 수정한다. 

상위 뷰와 하위 뷰의 개념을 상기하시기 바란다. ! Root 는 모든 View에 연결되어 있다.

이제 App에서 View에 대한 참조가 필요한 경우, findViewById() 를 호출하는 대신 binding 에서 뷰 참조를 가져올 수 있다. 

// Old way with findViewById()
val myButton: Button = findViewById(R.id.my_button)
myButton.text = "A button"

// Better way with view binding
val myButton: Button = binding.myButton
myButton.text = "A button"

// Best way with view binding and no extra variable
binding.myButton.text = "A button"

 

 

나왔던 문제점

1.

Data binding 을 추가하기 위해 dataBinding 을 enabled = true 로 수정하고, layout 을 추가하고..

강의가 마무리 되가는듯 싶었는데, 에러가 많이 나오는거다. 심지어 Build도 안됨. ㅡㅡ 

검색을 했더니 Clean compile 을 해라.. Rebuild 를 하라길래 했는데 안되는것이다. ㅡㅡ

ActivityBindingImpl 가 생성되었는데, 뭐 없다고 에러 뜨고 난리난리 ㅠ_ㅜ

예상외의 에러가 또 나와서 하..뭐지 하고 그냥 소스를 다 이전으로 돌려버렸다. ㅋㅋㅋ(무식)

덕분에 실습을 다시 한번 해볼수 있었다 ^^... 좀 더 빠르게.... ㅋㅋㅋㅋㅋㅋㅋ

(다음부턴 진행하면서 간간히 빌드 돌리면서 해야지^^....) 바인딩 하기 이전의 상태로 돌리고, 안드로이드 스튜디오 껐다가 킨 뒤에 다시 하나하나 천천히 추가하면서 Compile 시도 끝에 아주 정상적으로 동작하는것 확인. 

근데 .... 은근 불편하네 ... clean compile 이 제대로 안되는건가....?

 

2.

이 강의가 은근 불친절하다..... 중급이라 그런가 뭔가 설명이 디테일 하지 않다. 

입력 받은 값을 refresh? 해주고 다시 값을 써주기위해 invalidateAll() 을 써주는듯 하다. 

이미 어플이 run 하고 있는 상태에서, 값만 다시 refresh 해주는 역할인가보다. 

 

 

728x90
반응형