[Android/Kotlin] #View Binding 사용법

2022. 4. 8. 21:25
728x90
반응형

💡 View Binding이란?


우리는 기존에 Layout에 있는 View에 접근하기 위해서는 아래와 같이 사용해야 했었다.

// TextView 변수 선언
private lateinit var tvOne: TextView


// TextView 변수와 activity_main의 tvOne id를 가지는 View와 연결
tvOne = findViewById(R.id.tvOne)

Layout에 View과 많지 않다면 그렇게 귀찮은 일은 아니지만, View가 많을 경우 일일이 작성해야 하는 불편함이 있었다.

그래서 나온 것이 View Binding이다.

View Binding은 XML Layout 파일에 대한 Binding Class를 자동으로 생성해 View와 상호작용한다.

그렇기 때문에 별도의 연결과정 없이 Layout에 있는 View를 직접적으로 참조할 수 있다.

 

💡 사용법


우선 가장 먼저 app수준의 build.gradle에 android {..} 안에 다음 코드를 추가해야 한다.

이 코드의 의미는 뷰 바인딩을 활성화한다는 의미이다.

viewBinding {
        enabled = true
}

 

build.gradle에 코드를 추가했다면 아래의 코끼리 모양(Sync Project with Gradle Files)을 클릭해 Gradle 파일을 동기화시킨다.

 

여기까지 했다면 이제 View Binding을 사용할 수 있다.

 

ViewBinding을 사용하려면 자동으로 생성된 Binding Class를 가져와야 되는데 Class의 이름은 다음과 같은 규칙을 가진다.

1. XML 파일의 이름을 CamelCase로 변환한다.
2. 접미어 'Binding'이 추가된다.

Ex) activity_main → ActivityMainBinding

 

이름의 규칙을 알았으니 생성된 Binding Class를 가져온다.

private lateinit var binding : ActivityMainBinding

 

그리고 onCrate(savedInstanceState) 바로 아래에 있는 setContentView를 지워준다.

그리고 아래와 같이 코드를 추가한다.

// 기존 코드(삭제)
setContentView(R.layout.activity_main)

// 새로운 코드(추가)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

그럼 이제 XML Layout에 있는 View를 직접적으로 참조할 수 있다.

 

💡 예제


[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/tvOne"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"></EditText>

    <EditText
        android:id="@+id/tvTwo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"></EditText>

    <EditText
        android:id="@+id/tvThree"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"></EditText>
</LinearLayout>

 

[MainActivity.kt]

package com.test.viewbinding

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.test.viewbinding.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 새로운 코드(추가)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.tvOne.setText("hello")
        binding.tvTwo.setText("world")
        binding.tvThree.setText("!!")
    }
}

 

[결과]

728x90
반응형

BELATED ARTICLES

more