-
Android ViewBinding으로 FindViewByid 랑 작별하기Android 2021. 9. 25. 17:52test
1 서론
1.1 FindViewByid
안드로이드에서 Layout에 존재하는 컴포넌트를 객체로 사용하려면
FindViewByid를 통하여 작업을 했어야 했다.
만약 접근하려는 컴포넌트가 5개, 10개만 넘어도
class 파일에는 FindViewByid 가 많이 붙게 되는 걸 볼 수 있다.
또한 개발자의 실수로 인해 잘못된 컴포넌트를 참조하려 하면 null이 발생하는 문제가 있다.
예전에 Kotlin에서는 kotilin-android-extensions 을 통해 FindViewByid 없이도 컴포넌트에 접근하여 사용할 수 있는 게 큰 매력으로 다가왔지만
이제는 여러 문제점으로 인해 kotilin-android-extensions를 기본으로 제공하지 않는다.
따라서 이제는 ViewBinding를 사용하도록 권장하고 있다.1.2 ViewBinding
build.gradle에 viewBinding 속성을 활성화시키는 것으로 사용할 수 있으며
해당 모듈에 있는 layout 파일에 대한 binding class 가 자동으로 생성된다.
이렇게 생성된 binding class를 통해 해당 layout에 있는 모든 컴포넌트에 참조가 가능해진다.
즉 FindViewByid를 대체할 수 있게 된다.2 ViewBinding 사용하기
2.1 ViewBinding 활성화
android { buildFeatures { viewBinding true } }
이렇게 설정하는 것으로 Layout 파일에 대한 binding class 파일이 자동으로 생성되며
카멜 표기법으로 변환되고 이름 끝에 binding를 붙인 이름으로 생성된다.
activity_main.xml -> ActivityMainBinding로 생성된다.2.2 Layout에 컴포넌트 배치
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World!" android:textSize="15sp"/> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼1" /> </LinearLayout>
간단하게 TextView, Button 을 하나씩 배치하였다.
2.3 Activity Class 파일 수정
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
기본적으로 만들어진 Class는 위와 같은 모양을 하고 있다.
이제 이곳에 ViewBinding를 연결하면 된다.class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) } }
기존에 setContentView로 연결되어 있는 Layout이 아닌
Binding Class의 인스턴스를 얻기 위해 inflate()를 사용하여
rootView를 매개변수로 넣어주는 것으로 View를 참조할 수 있게 된다.2.4 컴포넌트 접근
class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.btn.setOnClickListener{ binding.tv.text="클릭"; } } }
'Android' 카테고리의 다른 글
Clean Architecture for Android (0) 2023.01.14 Hilt 사용 (0) 2022.09.05 Android Coroutine 사용하기 (0) 2021.09.25 Android Retrofit 사용하여 API 호출하기 (0) 2021.09.25 Android Retrofit 인터셉터 사용하기 (0) 2021.09.25