코딩하는 일용직 노동자

ViewBinding 이용하기 본문

안드로이드

ViewBinding 이용하기

bacass 2021. 3. 13. 14:48

안드로이드 초기부터 xml 파일의 뷰들과 연결하기 위해 findViewById를 해왔습니다만 매우 불편했습니다.
코틀린을 사용할땐 kotlin-android-extensions 덕분에 findViewById를 하지 않는 편리함이 있었습니다.
하지만, 서로다른 xml 파일에서 동일한 id를 사용할경우가 많기 때문에 kotlin-android-extensions를 사용할 경우 코드가 헷갈릴 수 있었습니다.
때문에 구글에서는 안드로이드 스튜디오 4.1 버전부터 kotlin-android-extensions의 지원을 중단하고 ViewBinding 을사용하도록 안내하고 있습니다.

ViewBinding 은 안드로이드 스튜디오 3.6 버전부터 지원했습니다.
app 레벨의 build.gradle 파일에서 아래처럼 추가하면 되었습니다.

android {
    ...
    viewBinding {
        enabled = true
    }
}


안드로이드 스튜디오 4.0 버전부터는 아래처럼 변경되었습니다.

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


우선 테스트를 하기 위해 간단한 프로젝트를 만들었습니다.
MainActivity 와 activity_main.xml 이 있는 간단한 프로젝트에 
텍스트뷰 3개와 버튼뷰 1개를 배치해봤습니다.


이제 MainActivity 소스내에서 아래처럼 뷰바인딩을 사용하기 위해 셋팅을 하고 
만들어진 뷰바인딩 객체 mBinding 을 이용해서 텍스트뷰와 버튼뷰를 이용합니다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // setContentView(R.layout.activity_main) // 뷰바인딩을 쓰면 이 코드는 필요없다.

    mBinding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(mBinding?.root)

    mBinding?.textView01?.text = "텍스트뷰 제목"
    mBinding?.textView02?.text = "뷰바인딩"

    mBinding?.button?.setOnClickListener {
        Toast.makeText(this@MainActivity, "버튼 클릭", Toast.LENGTH_SHORT).show()
    }

    mBinding?.textView03?.text = "간단하네"
}

뷰바인딩 mBinding 객체를 이용해 뷰에 접근할 수 있다.


프래그먼트에서는 아래 코드처럼 뷰바인딩을 셋팅해주면 됩니다.

private var mBinding: ActivityMainBinding? = null

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    mBinding = ActivityMainBinding.inflate(inflater, container, false)
    // Inflate the layout for this fragment
//        return inflater.inflate(R.layout.fragment_main, container, false) // 뷰바인딩을 쓰면 이 코드는 필요없다.
    return mBinding?.root
}

 

null safety 때문에 소스에 ? 가 많이 표시되는게 좀 거슬리다면 mBinding 객체를 생성할때 아래처럼 살짝만 바꿔주면 됩니다.

private lateinit var mBinding: ActivityMainBinding