본문 바로가기
개발/Android

[Android] View Binding(뷰 바인딩)

by tempus 2021. 8. 5.
반응형

기존에는 findViewById를 사용하다가 안드로이드 View Binding에 대하여 알게 되었습니다. 생각보다 사용하다 보니 훨씬 편리하고 코드의 생산성도 좋아졌습니다.

 

기본적으로 사용하는 방법은 build.gradle 파일에 해당 코드를 복사합니다. ( View Binding은 Android studio 3.6 Canary 11 이상에서부터 사용 가능합니다.)

android {
        ...
        viewBinding {
            enabled = true
        }
    }
    

예를 들어 activity_new.xml의 파일이 아래와 같다면

<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"
    tools:context=".NewActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text2"
        app:layout_constraintStart_toEndOf="@+id/textView1"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

이제 Activity에 오면 결합 클래스가 생성되는 것을 확인할 수 있습니다. 여기서 결합 클래스의 이름은 ActivityNewBinding입니다.

class NewActivity : AppCompatActivity() {

    private lateinit var binding : ActivityNewBinding

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


        binding.textView1.text = "change text1"
        binding.textView2.text = "change text2"

    }
}

fragment에서는 다음과 같이 사용하면 됩니다.

class NewFragment : Fragment() {
  
    private var _binding : FragmentNewBinding? = null
    
    private val binding get() = _binding!!
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        
        _binding = FragmentNewBinding.inflate(inflater, container, false)
        val view = binding.root
        
        binding.blank.text = "Victory"
        
        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

이렇게 선언을 하면 기존의 val text : TextView = findViewById(R.id.textView1)를 사용하지 않아도 된다는 것을... 왜 지금 발견했을까 반성을 많이 했습니다.

android developer 문서를 보면 다음과 같은 뷰 바인딩을 쓰면 기존의 findViewById보다 2가지의 장점을 가진다고 합니다.

  • Null-Safety : 뷰 바인딩은 뷰의 직접 참조를 생성하므로 유효하지 않은 뷰 ID로 인해 null 포인터 예외가 발생할 위험이 없습니다.
  • Type-Safety : 각 바인딩 클래스에 있는 필드의 유형이 XML 파일에서 참조하는 뷰와 일치 즉 클래스 변환 예외가 발생할 위험이 없습니다.

뷰 바인딩은 레이아웃 변수 또는 레이아웃 표현식을 지원하지 않으므로 XML 레이아웃 파일에서 직접 동적 UI 콘텐츠를 선언하는 데 사용할 수 없고 양방향 데이터 결합을 지원하지 않습니다. 그러므로 고급 기능들이 필요한 레이아웃에는 데이터 바인딩을 하고 그 외에는 뷰 바인딩을 사용하면 좋을 것 같습니다.

 

자세한 내용은 아래를 참고해주세요.

http://developer.android.com/topic/libraries/view-binding

 

뷰 결합  |  Android 개발자  |  Android Developers

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

developer.android.com

 

반응형

댓글


loading