[Android] ViewBinding

정상준·2023년 5월 14일
0
post-thumbnail
post-custom-banner

1. 뷰 바인딩이란

처음 안드로이드를 공부 할 때 기능 구현에만 급급하던 시절(지금도 마찬가지지만) xml의 뷰와 변수를 연결시켜주기 위해서 findViewById 라는 글루코드를 일일이 작성했었다.
하지만 ViewBinding을 사용하면 이러한 귀찮은 과정을 생략할 수 있기에 공부하고자 한다.

2. 사용법

1. 결합 클래스 생성

모듈에 뷰 결합을 사용하도록 설정되면 모듈에 포함된 각 XML 레이아웃 파일의 결합 클래스가 생성된다. 결합 클래스의 이름은 XML 파일의 이름을 카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성된다. ex) layout : activity_main.xml, 결합 클래스 :ActivityMainBinding

2. Activity 에서 사용 예시

result_profile.xml

<LinearLayout ... >
        <TextView android:id="@+id/name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/button"
            android:background="@drawable/rounded_button" />
    </LinearLayout>
    

생성된 결합 클래스 이름 : ResultProfileBinding

모든 결합 클래스에는 레이아웃 파일의 루트 뷰를 제공하는 getRoot() 메서드가 포함된다.

Activity에서 ViewBinding 사용

    private lateinit var binding: ResultProfileBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ResultProfileBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }

결합 클래스 인스턴스를 사용하여 뷰를 참조가능

    binding.name.text = viewModel.name
    binding.button.setOnClickListener { viewModel.userClicked() }

3. Fragment 에서 사용 예시

프래그먼트에 사용할 결합 클래스 인스턴스를 설정하려면 프래그먼트의 onCreateView() 메서드에서 다음과 같이 진행한다.

fragment_home.xml

<androidx.constraintlayout.widget.ConstraintLayout..>

        <TextView
            android:id="@+id/test"
            android:layout_width="190dp"
            android:layout_height="80dp"
            android:background="@drawable/tx_home"
            app:layout_constraintEnd_toEndOf="@id/constraint1"
            app:layout_constraintStart_toStartOf="@id/constraint1"
            app:layout_constraintTop_toTopOf="@id/constraint1" />


    </androidx.constraintlayout.widget.ConstraintLayout>

HomeFragment

class HomeFragment : Fragment() {

    private lateinit var hBinding: FragmentHomeBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View {
        hBinding = FragmentHomeBinding.inflate(inflater, container, false)
        hBinding.test.text = "view binding"

        return hBinding.root
    }
}

3. findViewId와 비교하여 이점

  • Null 안정성: 개발자가 실수로 유효하지 않은 id를 사용하면 null 오류가 발생할 수 있다.
  • Type 안정성: textView의 타입을 imageView라고 잘못 적어서 캐스팅하면 cast exception이 발생할 수 있다.
  • 속도가 상대적으로 빠르다.

참고자료
https://developer.android.com/topic/libraries/view-binding?hl=ko

profile
안드로이드개발자
post-custom-banner

0개의 댓글