홍드로이드의 야매코딩

[Android Kotlin] View Binding ( 뷰 바인딩 ) 본문

Android Kotlin

[Android Kotlin] View Binding ( 뷰 바인딩 )

홍드로이드 2021. 1. 12. 09:36

네 여러분들 안녕하십니까 홍 드로이드 입니다 :)

 

이번 시간에는 코틀린에서 View Binding ( 뷰 바인딩 )을 하는 방법에 대해서 안내드리도록 하려고 합니다.

 

우선 뷰 바인딩에 대해서 쉽게 말씀드리면 이전에 지속적으로 써오셨던 코틀린 익스텐션 에서의 뷰 접근을 위해 제공되던 기능과 동일하다고 보시면 됩니다.

 
현재 코틀린 익스텐션 같은 경우는 2021년에 지원 중단이 될 예정이므로 기존에 익스텐션 기능을 사용하셨던 분들이라면,
 
모두 뷰 바인딩으로 넘어오셔야 합니다.. !
 
 
사용 방법은 어렵지 않으니 바로 시작 하겠습니다.
 
우선 뷰 바인딩 옵션을 Gradle(그래들) 에서 활성화 시켜줘야 하는데요.. !
 
아래 내용과 같습니다.
 
 
[ 본 강의는 Android Studio 4.1.1 버전을 기준으로 작성되었습니다. ]
 
 
안드로이드 스튜디오 좌측 폴더들 중 Gradle Scripts -> build.gradle(Module: 프로젝트명) 파일로 접근하셔서 
android { 중괄호 내부 아무곳에 buildFeatures 구문을 작성해주시면 됩니다.. !
 
android {
    // 기존 내용들 생략..

    buildFeatures {
        // 뷰 바인딩 활성화
        viewBinding true
    }
}

 

 

 

 

바로 상단 즈음에 보시게되면 그래들 스크립트가 수정되는 즉시, Sync Now 라는 메시지를 클릭하셔서 그래들 수정사항을 반영해주세요 !

 

 

 

자, 뷰 바인딩 옵션을 활성화하게되면 무엇이 바뀌었다고 볼 수 있을까요??

 

프로젝트 상의 레이아웃 파일들 (xml 파일)이 바인딩 클래스라는 녀석이 생기게되고, 

각 파일들에 선언해두었던 뷰 들의 id 들의 참조가 포함됩니다.

 

==============================================================================

자동으로 생성된 바인딩 클래스의 이름이 지어지는 기준은 기존에 작성하신 레이아웃 파일 이름에서 조금 변형 됩니다.

1. 파스칼 케이스(첫 글자 대문자) + 카멜 케이스 (낙타의 굽은 등 처럼 단어 단위로 대 소문자처리)

2. 파일 이름 끝에 Binding 이라는 명칭이 달라붙습니다.

 

for example ) activity_main.xml -> ActivityMainBinding

==============================================================================

 

 

 

자 설명이 너무 길었죠??

 

이제 한번 직접 몸으로 느껴보기 위해서 프로젝트 생성 시 기본적으로 작성되어있던 

activity_main.xml에 다음과 같이 텍스트뷰에 tv_message라는 id를 선언해봅시다.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/tv_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

그 다음에 바로 

MainActivity.kt 파일로 이동하여 다음과 같이 뷰 바인딩 코드를 작성해봅시다.

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.hongdroid.viewbindingexample.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    // 전역 변수로 바인딩 객체 선언
    private var mBinding: ActivityMainBinding? = null
    // 매번 null 체크를 할 필요 없이 편의성을 위해 바인딩 변수 재 선언
    private val binding get() = mBinding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 기존 setContentView 를 제거해주시고..
//        setContentView(R.layout.activity_main)

        // 자동 생성된 뷰 바인딩 클래스에서의 inflate라는 메서드를 활용해서
        // 액티비티에서 사용할 바인딩 클래스의 인스턴스 생성
        mBinding = ActivityMainBinding.inflate(layoutInflater)

        // getRoot 메서드로 레이아웃 내부의 최상위 위치 뷰의
        // 인스턴스를 활용하여 생성된 뷰를 액티비티에 표시 합니다.
        setContentView(binding.root)

        // 이제부터 binding 바인딩 변수를 활용하여 마음 껏 xml 파일 내의 뷰 id 접근이 가능해집니다.
        // 뷰 id도 파스칼케이스 + 카멜케이스의 네이밍규칙 적용으로 인해서 tv_message -> tvMessage 로 자동 변환 되었습니다.
        binding.tvMessage.setText("안녕하세요 홍드로이드 입니다.")
    }

    // 액티비티가 파괴될 때..
    override fun onDestroy() {
        // onDestroy 에서 binding class 인스턴스 참조를 정리해주어야 한다.
        mBinding = null
        super.onDestroy()
    }
}

 

 

 

만약 Fragment (프래그먼트) 일 경우에 뷰 바인딩을 활용하고 싶다면 다음과 같이 작성해야 합니다.. !

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.hongdroid.viewbindingexample.databinding.FragmentMainBinding

class MainFragment : Fragment() {

    // 바인딩 객체 타입에 ?를 붙여서 null을 허용 해줘야한다. ( onDestroy 될 때 완벽하게 제거를 하기위해 )
    private var mBinding: FragmentMainBinding? = null
    // 매번 null 체크를 할 필요 없이 편의성을 위해 바인딩 변수 재 선언
    private val binding get() = mBinding!!
    
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 액티비티 와는 다르게 layoutInflater 를 쓰지 않고 inflater 인자를 가져와 뷰와 연결한다.
        mBinding = FragmentMainBinding.inflate(inflater, container, false)
        binding.tvMessage.setText(" 안녕 나는 홍드로이드야 !")
        return binding.root
    }

    // 프래그먼트가 destroy (파괴) 될때..
    override fun onDestroyView() {
        // onDestroyView 에서 binding class 인스턴스 참조를 정리해주어야 한다.
        mBinding = null
        super.onDestroyView()
    }
}

 

 

 

 

이상 입니다.

질문사항 있으시면 자유롭게 댓글남겨주시면 감사하겠습니다 :)

 

 

 

 

 

 

 

Comments