개발(Android)/android studio

[Android Studio/Kotlin] View Binding

shinyelee 2022. 5. 2. 23:51

[안드로이드 스튜디오/코틀린] 뷰 바인딩(뷰 결합)

사담

안드로이드, 코틀린을 공부하다보면 종종 생각지도 못한 곳에서 문제가 발생한다. 불과 작년 또는 재작년까지 잘 쓰던 기능인데 올해부터는 못 쓰게 되는 경우도 있다.

뷰아이디를 정석으로 참조하는 방법은 findViewById다. 하지만 이것조차 귀찮았던 많은 개발자들은 kotlin-android-extensions로 뷰아이디를 간편하게 참조했다. 문제는 이 익스텐션의 지원이 불과 작년에 종료됐다는 것이다. 코틀린 안드로이드 익스텐션이 뭔지도 모르는 상태에서 코드를 그대로 따라 치는 방식으로 공부하니 작동이 안 될 수밖에 없다. 다음 강의도, 다다음 강의도 아이디 참조에서 에러가 뜨며 막혔다. 분명 오타 없이 작성했는데 왜 안 되냐며 끙끙거렸는데, 영상에 달린 최근 댓글을 확인하고나서야 viewBinding으로 대체해야 한다는 사실을 알게 됐다.


build.gradle(:app)

android studio 3.6 ~4.0

// android 하위에 viewbinding 코드 입력
android {
        viewBinding {
            enabled = true
        }
    }

android studio ver 4.0 이상~

// buildFeatures 하위에 viewbinding 코드 입력
android {
    buildFeatures {
        viewBinding = true
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    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"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:text="뷰바인딩 테스트"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"/>

</LinearLayout>

MainActivity.kt

package com.shinyelee.android_study2

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.shinyelee.android_study2.databinding.ActivityMainBinding

// 메인화면
class MainActivity : AppCompatActivity() {

    val TAG: String = "로그"

    // (전역변수) 바인딩 객체 선언
    // bindingTest null 처리
    private var vBinding : ActivityMainBinding? = null

    // 매번 null체크 귀찮음 -> 바인딩 변수 재선언
    // bindingTest가 null이 아닐 때
    private val binding get() = vBinding!!

    // 뷰 생성
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

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

        // getRoot 메서드로 레이아웃 내부 최상위에 있는 뷰의 인스턴스 활용
        // -> 생성된 뷰를 액티비티에 표시
//        setContentView(R.layout.activity_main)
        setContentView(binding.root)

        // 이제부터 xml 파일 내 뷰아이디에 접근이 가능해져 findViewById 안 써도 됨
        // 뷰아이디가 view_id인 경우 viewId(카멜케이스)로 자동 변환됨
        binding.textView.setText("뷰바인딩 어렵지 않쥬?")
    }

    // 액티비티 파괴시
    override fun onDestroy() {
        // onDestroy에서 바인딩 클래스 인스턴스 참조를 정리함
        vBinding = null
        super.onDestroy()
    }
    // -> 이렇게 해 줘야 메모리 효율이 좋다고 함

}

뷰바인딩에 익숙해지자


참고

 

번역: 코틀린 안드로이드 익스텐션의 미래 (The Future of Kotlin Android Extensions)

#Android, #Kotlin, and #Tesla

www.androidhuman.com

 

안드로이드 코틀린 뷰 바인딩 View Binding TIL #26

회사를 다니니 피곤해서 집에 오면 자고 싶고.. 그러지만.. 발전을 위해서 계속 초심을 가지고 정진을 해야 할 것이다. 아직은 코틀린에 대해서 부족한 것이 많아서, 자바를 처음 배웠을 때 마음

daldalhanstory.tistory.com

 

안드로이드 뷰 바인딩(view binding)

1. 뷰 바인딩  1-1. 라떼는 말이야...  1-2. 변천사  1-3. findViewById와의 차이점 2. 사용법  2-1. gradle 추가  2-2. 액티비티  2-3. 프래그먼트  2-4. viewBindingIgnore 1. 뷰 바인딩 1-1. 라떼는 말..

todaycode.tistory.com

반응형