본문 바로가기
앱 개발

[android] view binding 뷰바인딩/뷰결합

by evekang 2022. 1. 5.

Intent()를 사용한 화면 전환을 구현하기 위해서는 뷰바인딩을 가지고 처리를 해줘야 한다.

(뷰바인딩은 Android Studio 3.6 Canary 11이상에서 사용이 가능하다.)

 

우선, buil.gradle(Module: app)을 열어 아래의 코드를 추가한 후, 반드시 오른쪽 상단의 [Sync Now]로 저장해줘야 한다.

그리고 Intent 기능을 구현하고자 하는 activity에 아래와 같이 작성한다.

 

1. private lateinit var '변수명' : '생성된 결합클래스 이름'

private lateinit var binding: ActivityMainBinding
※ 생성된 결합클래스 이름은 자동으로 입력되지 않고 직접 입력해줘야 한다.
이름 생성법은 xml이름을 카멜표기법으로 표기하고 끝에 'Binding'을 붙여서 만들어 준다.
예) result_profile.xml → ResultProfileBinding

 

 

2. 뷰바인딩 클래스 인스턴스를 설정하기 위해서 Activity의 onCreate() 메서드 안에서

binding = ActivityMainBinding.inflate(layoutInflater) //binding 객체 초기화 : inflate()메서드 호출
var view = binding.root //루트 뷰 참조 가져오기
setContentView(view) // 활성 뷰로 만들기
1) 생성된 뷰바인딩 클래스에 포함된 inflate()메서드 호출 (변수명은 마음대로)
2) getRoot() 메서드를 호출하거나 Kotlin 속성 구문을 사용하여 루트 뷰 참조를 가져옴 (변수명은 마음대로)
3) 루트 뷰를 setContentView()에 전달하여 화면에서 활성 뷰로 만듦

 

 

 

뷰바인딩을 위한 준비 끝.

 

사용법은 '바인딩 변수명'.'xml에 존재하는 id명' 으로 하면 된다.

binding.btnA.setOnClickListener {

 

완성 코드 [MainActivity.kt] 

package com.eve.intentkt

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.eve.intentkt.databinding.ActivityMainBinding

private lateinit var binding: ActivityMainBinding

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

        binding = ActivityMainBinding.inflate(layoutInflater) //binding 객체 초기화 : inflate()메서드 호출
        var view = binding.root //루트 뷰 참조 가져오기
        setContentView(view) // 활성 뷰로 만들기

        binding.btnA.setOnClickListener {
            binding.tvSendMsg.setText("글자가 바뀌었어용")
        }
    }
}

 

 

[추가]

1. 뷰바인딩을 사용하고자 하는 모든 Activity에 저렇게 작성해줘야 한다. 상당히 번거로운데 한번에 끝낼 수 있는 방법이 없을까?

2. inflate() 메서드를 사용해서 객체를 초기화 시킬때, MainActivity와 SubActivity 둘다 변수명을 binding으로 동일하게 주었는데 에러없이 원활하게 돌아갔었다. Activity마다 다른 바인딩명을 사용할 필요는 없을 것 같다. 

반응형

댓글