Android/Study

[View binding]

화요밍 2022. 8. 12. 17:01
728x90
반응형
View binding이란?
View와 상호작용하는 코드를 쉽게 작성할 수 있도록 도와주는 기능입니다.
앱 모듈에서 View binding 기능을 활성화하면, 모듈 내의 각각의 XML 레이아웃 파일에 대한 바인딩 클래스를 자동적으로 생성합니다.
바인딩 클래스의 인스턴스를 통해 레이아웃에 존재하는 모든 View들을 ID로 직접 참조할 수 있습니다.

 

View binding vs findViewById

View binding에는 findViewById에 비해 다음과 같은 장점이 있습니다.

  1. Null safety: View binding은 view에 대한 직접참조를 생성하기 때문에 Null pointer exception에 대한 위험이 없습니다. 또한, 레이아웃의 일부 configuration에만 view가 있는 경우, 바인딩 클래스에서 참조를 포함하는 필드가 @Nullable로 표시됩니다.
  2. Type safety: 바인딩 클래스의 필드들은 XML 레이아웃 파일 내의 View 타입에 매칭되어 있습니다. 따라서 Cast Exception이 발생할 위험이 없습니다.

 

 

Setup

View binding은 모듈 단위로 활성화됩니다.

따라서, 모듈 레벨의 build.gradle 파일에 viewBinding 옵션을 true로 설정해줘야 합니다.

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

 

* 레이아웃 파일에 대한 바인딩 클래스를 생성하지 안하기

만약 특정 레이아웃 파일에 대한 바인딩 클래스 생성을 원치 않는다면, 레이아웃 파일의 Root view에 다음 속성을 추가하면 됩니다.

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

 

 

Usage

  • Activity에서 View binding 사용하기

1. XML 레이아웃 파일 구성

 바인딩 클래스의 이름은 XML 파일의 이름을 Pascal case로 전환하고 뒤에 "Binding"을 붙여서 지어집니다.

각각의 바인딩 클래스는 getRoot() 메서드를 포함하고 있으며, Root View에 대한 직접 참조를 제공합니다.

또한, 모든 View들의 ID에 대한 참조들을 포함합니다.

 

가령, 아래 activity_main.xml 레이아웃 파일에 대한 바인딩 클래스 이름은 ActivityMainBinding입니다.

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

 

ActivityMainBinding은 getRoot() 메서드로 LinearLayout을 반환하며, name과 button을 필드로 가집니다.

ImageView의 경우, ID가 없기 때문에 바인딩 클래스에서 참조하고 있지 않습니다.

 

 

2. 바인딩 클래스의 인스턴스 Set up

 먼저, 바인딩 클래스에 포함된 inflate() 메서드를 호출하여 바인딩 클래스의 인스턴스를 생성합니다.

그리고 Root view에 대한 참조를 getRoot() 메서드나 코틀린 property syntax를 사용해 가져옵니다.

Root view를 setContentView()에 넘겨주어 화면 위에 active한 view로 만들어 줍니다.

class MainActivity : AppCompatActivity() {
    val binding by lazy {
        ActivityMainBinding.inflate(layoutInflater)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)


    }
}

 

3. View와 상호작용하는 코드 작성

binding.name.text = "Test"
binding.button.setOnClickListener { ... }

 


  • Fragment에서 View binding 사용하기

1. XML 레이아웃 파일 구성

 

2. 바인딩 클래스의 인스턴스 Set up

Fragment는 View보다 더 오래 지속됩니다.

따라서, onDestroyView() 메서드에서 바인딩 클래스의 인스턴스 참조를 없애줘야 합니다.

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

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

3. View와 상호작용하는 코드 작성

binding.name.text = "Test"
binding.button.setOnClickListener { ... }

 

728x90
반응형