TIL 51 | [Android] Android 뷰의 구조와 뷰 바인딩

Yoonsik·2022년 10월 19일
0

Android

목록 보기
1/3

⛓ Android 뷰 란?

안드로이드 뷰는 안드로이드 개발을 편하게 하기위해 실제 디렉터리 구조인 Project 뷰를 재배치한 가상의 디렉터리를 보여줍니다.

실제 디렉터리 구조인 Project 뷰의 구조는 매우 복잡한 구조로 되어 있기 때문에, 보통 작업할때는 이를 보기 쉽게 재배치한 가상의 디렉터리를 보여주는 안드로이드 뷰를 사용하는 것이 효율적입니다.

🔗 Android 뷰의 구조

안드로이드 뷰의 구조는 크게 appGradle Scripts로 구성됩니다.

  • app : 코딩하면서 생성한 모든 파일이 저장됨
    • manifests : 설치 관련 디렉터리이다.
      AndroidManifest.xml 파일에서 응용 프로그램(앱)의 기본 정보 저장한다.

    • Java : 이벤트 프로그램을 담당하는 소스코드(kotlin)를 저장하는 디렉터리이다.

    • res : 자원(resource)들이 저장되는 디렉터리이다.

      • drawable : 사진
      • layout : 레이아웃(activity_main.xml)
      • values : 값들(컬러값, 문자열값 ...)
        • colors.xml
        • strings.xml
      • themes : 테마

  • Gradle Scripts : 빌드에 필요한 설정 정보들이 저장된다.

    • build.gradle : 뷰 바인딩 설정
      Gradle Scripts -> bild.gradle
      
      ...
      android {
      	buildFeatures
      	{
      		viewBinding true
          }
      	...
      }

⛓ 코틀린 코드와 레이아웃 연결하기 - 뷰 바인딩

화면 레이아웃과 그 안에 배치되는 위젯(버튼, 텍스트 뷰 ...) 과 같이 사용자에게 보이는 것들을 통칭해서 View(뷰) 라고 합니다.

이 뷰는 용도에 따라 부르는 이름이 다른데, 배치하는 역할은 레이아웃, 컨트롤하는 역할이면 위젯이라고 합니다.

이러한 뷰는 activity_main.xml이라는 레이아웃 파일에서 만들어집니다.

뷰 에서 버튼과 같은 요소들을 동작시키기 위해서는 뷰와 소스코드를 연결해주어야 합니다. 이 과정을 뷰 바인딩 이라고 합니다.

🔗 뷰 바인딩

뷰와 소스코드를 연결해주는 방법중 하나입니다. (뷰 안의 요소들을 동작시키기 위함 !)

🔗 기본적인 뷰 바인딩 방법

1) bild.gradle 파일에 viewBinding 설정을 추가

buildFeatures
{
	viewBinding true
}

2) 안드로이드 스튜디오 상단에 나타나는 sync Now 클릭 -> viewBinding 설정이 적용된다.

3) res - layout 디렉터리 내부의 activity_main.xml 화면을 구성하는 여러 요소들이 들어있는 레이아웃 파일을 작성한다.

4) viewBinding이 설정되어 있기 때문에 안드로이드가 레이아웃 파일(activity_main.xml)을 바인딩클래스로 생성한다.

  • 바인딩으로 자동변환 공식 : 레이아웃 파일명(첫 글자, 언더바 다음 첫 글자 -> 대문자로 변환) + Binding
    activity_main.xml -> ActivityMainBinding(바인딩으로 생성된 상태)

5-1) MainActivity.kt 코틀린 파일의 코틀린 코드에서 클래스로 변환된 바인딩(ActivityMainBinding)의 inflate 함수로 초기화하고, 변수에 저장

var 변수 = ActivityMainBinding.inflate(layoutInflater)
innflate() 함수는 xml에 있는 뷰를 객체화해준다.
즉, xml에 있는 뷰(레이아웃, 위젯)가 activity_main.xml 에서 지정한 아이디 값으로 각각 분류되는 객체로 생성된다.

5-2) 변수에 저장된 바인딩의 root 뷰를 setContentView에 저장
setContentView(변수.root)

6) 바인딩을 도트연산자.로 뷰(요소)의 id로 접근 후 사용
변수.textView = "Hello"


🔗 by lazy를 이용한 뷰 바인딩 방법

by lazy 키워드는 값을 지정하는 것을 미루는 작업입니다.
값이 할당되는 시점이 해당 변수를 호출하는 시점입니다.
아래 코드를 보면 name 변수 선언부분에 by lazy 키워드가 붙고 내부 브래킷에 "abcd" 코드가 있습니다.
이는 name변수가 호출되는 시점- print(name)에 "abcd"값을 name에 할당 하겠다는 의미 입니다.

class Test {
    val name : String by lazy {
        println("this is name by lazy")
        "abcd"
    }

    init {
        println("I am here")
        println(name)
    }
}

// 실행 결과
I am here
this is name by lazy
abcd
  • by lazy 키워드는 immutable 변수에서만 적용이 가능해, val 키워드 변수에만 적용이 가능합니다.(val은 초기화 이후에 새로운 값을 대입할 수 없음 immutable)

  • by lazy 키워드는 변수 값을 최초에만 설정하고 변경할 필요가 없는 경우 사용하면 유용합니다.

  • by lazy 키워드는 변수 선언시에 값을 assign할 순 없지만 다른 변수들을 조합해 값을 설정하고 싶을 때 사용하면 유용합니다.


앞에서 설명한 뷰 바인딩 과정 3) 번까지 완료한 후, 아래부터 설명할 by lazy 키워드를 이용한 뷰 바인딩을 사용하시면 됩니다.

3) res - layout 디렉터리 내부의 activity_main.xml 화면을 구성하는 여러 요소들이 들어있는 레이아웃 파일을 작성한다.

4) 소스코드에서 by lazy 키워드를 사용하여 해당 binding 변수 최초 호출시에 초기화 되도록 binding 프로퍼티를 선언하시고 사용합니다.
이때, 주의할점은 setContentView에 binding.root를 전달해야지만 정상동작 합니다.(R.layout.activity_main 사용 X)

class MainActivity : AppCompatActivity() {
    val binding by lazy {
        ActivityMainBinding.inflate(layoutInflater)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        
        ...
}

📌 Reference

https://flow9.net/bbs/board.php?bo_table=android&wr_id=27
https://selfish-developer.com/entry/kotlin-lateinit-lazy-by

profile
꾸준함의 힘

0개의 댓글