앱 개발/Andriod Studio

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

cha430 2026. 1. 12. 11:37

 

 

코틀린 익스텐션이 2021년 중단된다고 한다.

? 난 2025년에 처음 써보는데

그럼 이제 자동으로 되게 해줘야하는 거 아닌가....

 

 

어쨌든, 

기존에 textView나 imageView 같은 것들을 참조할 때 

id가 "et_id" 라면

var etId = findViewById<EditText>(R.id.et_id)

 

이렇게 findViewById 를 써서 사용했는데, 

 

ViewBinding을 사용하면 findViewById() 없이
binding 객체를 통해 XML의 View를 바로 접근할 수 있다.

 

 

 

 

Gradle 파일에서 설정을 해야 한다.

 

 

Gradle Scripts -> build.gradle(Module: 프로젝트명) 파일

 

 

 

android 블록의 buildFeatures에서 viewBinding을 true로 설정한다.

 

android {
	...
    buildFeatures {
        viewBinding = true
    }
}

 

 

 

 

그리고 Sync Now 를 클릭하여 Gradle 파일 수정사항을 반영해준다.

 

 

 

 

기존에 fineViewById() 사용했을 때 아래와 같이 썼던 MainActivity.kt 파일을 수정해야한다.

 

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {    // 액티비티가 최초 실행되면 수행하는 부분
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)

        var btnTest = findViewById<Button>(R.id.btn_test)
        var etId = findViewById<EditText>(R.id.et_id)
        var etId2 = findViewById<EditText>(R.id.et_id2)

        btnTest.setOnClickListener {
            var resultText = etId.text.toString()
            etId2.setText(resultText)
        }
    }
}

 

 

Activity는 생명주기상 null처리가  필요 없고

onDestroy() 처리도 필요 없다고 한다.

(Activity에서는 View가 Fragment처럼 재사용되지 않기 때문)

 

 

  • Fragment → View가 onDestroyView()에서 사라짐 → null 처리 필수
  • Activity → onDestroy() = Activity 완전 종료

 

 

 


 

 

private lateinit var binding: ActivityMainBinding

 

activity_main.xml 전체 화면을 대표하는 "연결 객체"를 담을 전역 변수를 선언한다.

 

Activity는 onCreate()에서 초기화하기 때문에  초기화 시점을 미룬다.

(lateinit : 나중에 초기화)

그리고 val 은 lateinit 불가하므로 꼭 var로 선언 **

(초기화 전에 접근하면 에러 !!!)

 

 

lateinit var binding 한 줄 설명

Activity의 레이아웃(XML)을 inflate해서 생성된 ViewBinding 객체를 저장하기 위한 변수이며,

onCreate에서 초기화되어 findViewById 없이 View에 접근하게 해준다.

 

 

 


 

 

 

override fun onCreate() 에서

setContentView(R.layout.activity_main)

 

layout 대신 binding.root 로 변경해준다.

setContentView(binding.root)

 

 

 

 

 

 

결과

 

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {    // 액티비티가 최초 실행되면 수행하는 부분
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btnTest.setOnClickListener {
            val resultText = binding.etId.text.toString()
            binding.etId2.setText(resultText)

        }
    }
}

 

 

이렇게 id 준 것을 사용할 수 있다.