- 안드로이드/kotlin

코틀린 뷰 바인딩 view binding 사용하기

더모어더베러 2023. 12. 6. 13:47

[ 안드로이드 스튜디오 버전 Flamingo (2022.2.1) ]

 

뷰 바인딩 사용법에 대해 정리해보겠습니다.

 

Gradle 모듈 작성

gradle 모듈에 아래와 같이 코드를 추가 해줍니다.

 

android {
...

    buildFeatures { // 뷰바인딩
        viewBinding = true
    }
   

...
}

 

그 다음 sync now를 눌러 적용해주세요! 

 

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

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

 

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

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

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

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

 

for example ) activity_main.xml -> ActivityMainBinding

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

 

 

액티비티에서 binding 사용하기

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()
    }
}

 

 

 

프래그먼트에서 binding을 사용 한다면 아래와 같이 사용 하시면 됩니다.

 

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()
    }
}

 

 

 

참고자료 : https://duckssi.tistory.com/42