[Android]/[Kotlin]

[안드로이드 강의작성] View Binding이란 ( Feat. Data Binding )

Hevton 2023. 1. 10. 18:08
반응형

 

안드로이드에는 전개된 뷰를 참조하는 findViewById라는 함수가 있다. 이 함수를 많이 봤을 것이다.

setContentView를 이용해 전개한 레이아웃 파일에서, 또는 직접 전개한 뒤에

이 함수를 이용해서, 뷰와 소스코드를 연결한다.

 

코틀린에서는 이를 조금 더 효율적으로 사용하기 위해서 '코틀린 익스텐션(Kotlin Extension)'을 제공했었지만

다음과 같은 이유로 폐기되었다.

 

1. 코틀린에서만 사용하므로, 자바에서는 사용불가

2. 일부 상황에서 뷰를 찾을 수 없는 오류 발생

3. 어디서나 뷰를 호출할 수 있기에, 잘못된 참조로 앱이 강제종료 당할 수 있음

 

 

따라서 뷰 바인딩 방식을 이용해서 뷰와 코드를 연결한다.

이렇게 하면 findViewById를 사용하지 않으며, 간편하게 뷰와 코드를 연결할 수 있다.

 

 

1. build.gradle (app module) 로 들어간다.

 

 

2. 뷰 바인딩을 사용하겠다는 코드를 추가해준다.

android {

    // 여기서부터
    buildFeatures {
        viewBinding true
    }
    // 여기까지


    namespace 'made.by.hevton.love'
    compileSdk 32
    
    .
    .
    .
}

viewBinding을 사용하겠다는 옵션이다.

 

또는 아래처럼 해준다.

    viewBinding {
        enable = true
    }

 

 

 

3. 추가했으면, Sync Now를 해준다.

 

 

4. MainActivity.kt 을 열고, 소스 코드를 편집한다.

 

activity_main.xml을 사용할 것인데, 뷰 바인딩 네이밍 자동변환 공식은 이렇다.

레이아웃파일명(첫 글자와 언더바 다음 영문을 대문자로 변환) + Binding

ex) activity_main.xml = ActivityMainBinding 

 

편집 전 코드

package made.by.hevton.love

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        setContentView(R.layout.activity_main)
    }
}

 

편집 후 코드

package made.by.hevton.love

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import made.by.hevton.love.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        
        // layoutInflater는 모든 Activity에서 호출할 수 있다.
        val binding = ActivityMainBinding.inflate(layoutInflater)
        
        setContentView(binding.root);
    }
}

 

동일한 기능을 하는 코드이다.

 

 

5. 활용

 

현재 activity_main.xml 코드는 다음과 같다.

<?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">


    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="BUTTON"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

 

이를 토대로, 버튼을 누르면 텍스트가 변경되게끔 수정해보자.

 

MainActivity.kt

package made.by.hevton.love

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import made.by.hevton.love.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


        val binding = ActivityMainBinding.inflate(layoutInflater)

        setContentView(binding.root);

        // binding.btn.setOnClickListener(리스너) 리스너를 정의해놨다가 등록 방식

        binding.btn.setOnClickListener { // 괄호 안의 코드가 실행되게끔 방식

            binding.btn.text = "GOOD !"
        }
    }
}

버튼을 클릭하면 텍스트가 GOOD ! 으로 바뀐다.

 

 

 

View Binding 말고도 요즘에는 Data Binding 이라는 기술도 많이 쓰이는데,

Data Binding은 View Binding의 기능을 갖춘 확장판이라고 볼 수 있다.

 

'뭐가 항상 더 낫다' 라기보단, 사용에 따라 View Binding이 더 효율적일 때가 있다.

굳이 Data Binding을 사용하지 않아도 될 때엔 View Binding이 낫다.

 

 

데이터 바인딩에 대해서는 다음 글에 추가로 다룬다!

반응형