ViewBinding사용법

수뱀 ㅣ 2024. 10. 21. 21:56

뷰 바인딩이란 xml과 액티비티의 연결을 간편화시켜주는 기능이다

 

뷰 바인딩이 없던 시절의 안드로이드 개발자는 아래와 같이 xml의 요소를 findViewById를 통해 변수에 연결시켜야만했다

<Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="버튼을 눌러주세요" />
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        
        //타입을 지정하고 id를 가져와서 변수에 매칭시킨다
        var button = findViewById<Button>(R.id.button)
        
        // 버튼에 대한 동작작업
        button.setOnClickListener { ... }

 

하지만 ViewBinding을 사용한다면 일일이 매칭시킬필요없이 연결된 xml의 요소들을 바로작업할수있다

class MainActivity : AppCompatActivity() {
    
    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        
        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)
        
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        //바인딩해서 바로사용
        activityMainBinding.apply {
            val buttonListener =ButtonListener()
            button.setOnClickListener (buttonListener)
        }
    }...

 

 

사용법

1. gradle 설정

android {
    ...
    //뷰 바인딩 사용
    viewBinding{
        enable = true
    }
}

 

이렇게 작성하고 꼭 코드상단 sync now를 누른다

 

2. 액티비티

class MainActivity : AppCompatActivity() {

    //객체를 담을 변수선언
    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        //ViewBinding 객체를 가져온다
        // layoutInflater : layout 폴더에 있는 xml 파일을 통해 화면 객체를 만들 수 있는 도구
        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)

        //ViewBinding 객체가 관리하는 화면요소중 최 상단에있는 화면요소를 지정하여 화면이 나오도록한다
        setContentView(activityMainBinding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        // 바로사용가능!
        activityMainBinding.button

 

xml의 이름에 따라 바인딩 클래스의 이름이 정해지는 규칙이 있다 규칙은 아래와같다

//xml이름 : activity_main.xml
ActivityMainBinding

//xml이름 : activity_example.xml
ActivityExampleBinding

//xml이름 : aaa_bbb_ccc.xml
AaaBbbCccBinding