View Binding 설정 및 사용(Kotlin)

소개



View Binding 설정 방법과 사용법을 소개합니다.

「View Binding」이란?



뷰를 조작하는 코드를 간단하게 기술할 수 있는 기능입니다.

각 XML 레이아웃 파일에 대해 바인딩 클래스가 자동으로 생성되며 대상 레이아웃 내에서 ID가 있는 모든 뷰에 대한 참조가 있습니다.

findViewById와의 차이



View Binding은 findViewById의 상위 호환이라고 할 수 있습니다.

널 안전



View Binding은 뷰를 참조하는 코드를 자동으로 생성하므로 잘못된 뷰 ID를 지정하면 NullPointerException이 발생하지 않습니다.

형 안전



바인딩 클래스의 필드는 레이아웃 파일과 같은 형식을 가지므로 ClassCastException이 발생하지 않습니다.

환경


  • OS: macOS Big Sur 11.5.2
  • Android Studio: Arctic Fox | 2020.3.1 Patch 1
  • Kotlin:1.5.21
  • Gradle:7.0.2
  • Gradle plugin:7.0.1

  • 설정



    View Binding 활성화



    app 폴더 아래의 'build.gradle'에서 View Binding을 활성화합니다.

    /app/build.gradle
    android {
    +   viewBinding {
    +       enabled true
    +   }
    }
    

    이것으로 View Binding 설정이 완료됩니다.

    사용법



    조각으로 View Binding하기



    다음 레이아웃 파일의 조각이 있다고 가정합니다.

    monster_detail_fragment.xml
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:orientation="vertical"
        tools:context=".ui.monsterdetail.MonsterDetailFragment">
    
        <ImageView
            android:id="@+id/icon_imageview"
            android:layout_width="240dp"
            android:layout_height="240dp"
            android:layout_marginTop="56dp"
            android:contentDescription="@string/icon_description"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0"
            app:layout_constraintVertical_chainStyle="packed"
            tools:src="@tools:sample/avatars" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    MonsterDetailFragmentBinding 클래스가 자동으로 생성되므로 속성에 추가합니다._binding (은)는 바인딩 클래스의 초기화와 해방에만 사용해, 그 외에서는 binding (을)를 사용합니다.

    MonsterDetailFragment.kt
    class MonsterDetailFragment : Fragment() {
    +   private var _binding: MonsterDetailFragmentBinding? = null
    +   private val binding get() = _binding!!
    }
    

    바인딩 클래스의 초기화와 해방을 추가합니다.

    MonsterDetailFragment.kt
    class MonsterDetailFragment : Fragment() {
        private var _binding: MonsterDetailFragmentBinding? = null
        private val binding get() = _binding!!
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
    -       return inflater.inflate(R.layout.monster_detail_fragment, container, false)
    +       _binding = MonsterDetailFragmentBinding.inflate(inflater, container, false)
    +       return binding.root
        }
    }
    
        override fun onDestroyView() {
            super.onDestroyView()
    
    +       _binding = null
        }
    }
    

    이제 뷰가 ​​바인딩되었습니다.binding.{ビュー名}에서 액세스할 수 있습니다.

    MonsterDetailFragment.kt
    class MonsterDetailFragment : Fragment() {
        private var _binding: MonsterDetailFragmentBinding? = null
        private val binding get() = _binding!!
    
        private val monster: MonsterItem = ○○
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
    -       val iconImageView: ImageView = view.findViewById(R.id.icon_imageview)
    -       iconImageView.load(monster.iconUrlString)
    +       binding.iconImageview.load(monster.iconUrlString)
        }
    }
    

    데이터 바인딩과의 차이



    Data Binding에 대한 자세한 내용은 다음 기사를 참조하십시오.

    Data Binding은 편리하지만 View Binding은 더 간단하며 이로 인한 장점과 단점이 있습니다.

    장점



    컴파일이 빠름



    View Binding은 어노테이션으로 코드를 자동으로 생성하지 않으므로 컴파일이 빠릅니다.

    설정이 간단합니다.



    데이터 바인딩과 달리 XML 레이아웃 파일을 편집하지 않고 대상 모듈의 모든 레이아웃에 자동으로 적용됩니다.
    그 때문에, 설정이 간단합니다.

    단점



    레이아웃 파일로 바인딩할 수 없음



    데이터 바인딩은 레이아웃 파일로 바인딩할 수 있지만 뷰 바인딩에서는 할 수 없습니다.

    양방향 바인딩할 수 없음



    Data Binding과 달리 View Binding에서는 양방향 바인딩할 수 없습니다.

    결론



    이제 Null 안전하고 형식 안전하게 뷰를 조작할 수 있습니다!
    가능한 한 findViewById 줄여 봅시다

    덧붙여서 본 기사의 내용은, 모두 Data Binding에서도 실현할 수 있습니다.
    Data Binding에서 컴파일 시간이 걱정되지 않았고 Data Binding만 사용하고 있습니다.
    View Binding만 사용하고 있거나 병용하고 있는 사람이 있으면 이유를 코멘트 등으로 가르쳐 주시면 기쁩니다.

    참고 링크


  • 보기 바인딩  | Android 개발자  | Android Developers
  • 좋은 웹페이지 즐겨찾기