본문 바로가기

프로그래밍/안드로이드

[Android/Kotlin] View Binding 뷰 바인딩

View Binding이란 XML 레이아웃 내의 View를 참조할 수 있게 만들어주는 기능으로, findViewById와 Kotlin Sythetics를 대체하는 기능이다.

findViewById에 비해 간편하게 View를 참조할 수 있으며, 코딩 중에 발생할 수 있는 여러 문제들을 예방할 수 있다.

(예: 서로 다른 XML에 동일한 id의 View가 있을 경우 발생할 수 있는 문제)

 

처음 안드로이드 스튜디오 공부를 시작했을 때 Kotlin Sythetics를 사용했는데 찾아보니 미래에 사라질 예정이라고...

자세한 내용은 아래 링크에서 확인하면 된다.

 

뷰 결합  |  Android 개발자  |  Android Developers

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정된 뷰 결합은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성합니다. 바인딩 클래스의

developer.android.com


사용방법

앱 Gradle에 다음 구문을 추가한다

build.gradle (:app)
 
android {
    // Android Studio 3.6 버전대
    viewBinding {
        enabled = true
    }
    // Android Studio 4.0 이상
    buildFeatures {
        viewBinding = true
    }
}

 

그 후에 Layout과 연결 작업을 해야 한다.

MainActivity.kt
 
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding          // 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)   // 2
        setContentView(binding.root)                            // 3
    }
}

View Binding을 활성화하면 레이아웃 xml 파일에 대한 클래스가 Binding이 뒤에 붙은 Pascal Case로 생성된다.

(activity_main.xml → ActivityMainBinding)

해당 클래스를 inflate하고 setContentView에 binding.root를 전달하면 준비가 완료된다.

 

프래그먼트에서의 사용 방법은 다음과 같다.

MainFragment.kt
 
// fragment_main.xml 파일과 결합할 때

class MainFragment : Fragment() {
    private var _binding: FragmentMainBinding? = null
    private val binding get() = _binding!!
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        _binding = FragmentMainBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

입력해야 할게 액티비티보다 조금 더 있다.

 

이렇게 결합을 하고 나면 findViewById를 사용할 필요 없이 바로 view를 참조할 수 있다.

Xml 내의 view들은 Camel Case로 참조한다.

MainActivity.kt
 
// ID가 'tv_text1'인 TextView의 텍스트를 바꿀 때
binding.tvText1.text = "Hello World"