본문 바로가기
개발/kotlin

[Kotlin] 코틀린에서 뷰 바인딩(View Binding)

by 1인용 놀이터 2025. 3. 27.
728x90
반응형

뷰 바인딩(View Binding)

 

뷰 바인딩은 XML 레이아웃 View와 상호작용하는 코드를 더 쉽게 참조 할 수 있도록 하는 기능이다.

뷰 바인딩을 이용하면 findViewById()를 사용할 필요 없이 자동으로 View Id를 가져올 수 있다.

 

뷰 바인딩을 사용하는 이유

1. findViewById()보다 간편하고 안전하다

  • findViewbyId()는 뷰 ID를 잘못 입력해도 컴파일 시 오류가 발생하지 않아서 앱 실행 중 크래시 가능성이 있다.
  • 뷰 바인딩은 컴파일 시 뷰 ID를 확인하므로 오류를 미리 방지 할 수 있다.

2. Null 안전성

  • findViewById()로 찾은 뷰는 null이 될 가능성이 있다.
  • 하지만 뷰 바인딩을 사용하면 null이 될 가능성이 없다.

3. 간결한 코드

  • findViewById()를 여러 번 사용할 필요 없이, 바로 binding 객체를 통해 뷰를 조작할 수 있다.

 

View Binding 설정

1. gradle 설정

뷰 바인딩은 안드로이드 3.6 이하 버전에서는 적용되지 않는다.

// 안드로이드 스튜디오 4.0 이상

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

 

// 안드로이드 스튜디오 3.6 ~ 4.0

android {
	....
    viewBinding {
    	enbaled true
    }
}

 

2. xml 설정

바인딩 클래스를 생성하는 동안 레이아웃 파일을 무시하려면 아래 속성을 root view에 추가할 수 있다.

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

 

3. Activity 설정

 

  • 기존 findViewById 사용

 - 해당 방식은 뷰 ID를 잘못 입력해도 앱이 실행 될 때까지 오류를 알 수 없다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView = findViewById<TextView>(R.id.textView)
        textView.text = "Hello, ViewBinding!"
    }
}

 

  • 뷰바인딩 적용 방식

 - findViewById() 없이 바로 binding.textView로 뷰 조작이 가능하다.

 - 타입 캐스팅이 필요가 없다 (findViewById<TextView>() 불필요)

 - 컴파일 시 뷰 ID를 체크하므로 오류 방지.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding  // 바인딩 객체 선언

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

        binding = ActivityMainBinding.inflate(layoutInflater)  // 바인딩 객체 초기화
        setContentView(binding.root)  // 루트 뷰 설정

        binding.textView.text = "Hello, ViewBinding!"  // XML 뷰 직접 참조
    }
}

 

 

4. 프래그먼트에서 뷰 바인딩 설정

 - 프래그먼트에서는 onDestoryView()에서 뷰 바인딩을 해제해야 한다.

 - 프래그먼트는 View 보다 생명주기가 길기 때문에 메모리 누수 방지를 위해 binding을 null로 설정해야 한다.

class MyFragment : Fragment() {
    private var _binding: FragmentMyBinding? = null
    private val binding get() = _binding!!  // Null Safety

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentMyBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.textView.text = "Hello, Fragment ViewBinding!"
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null  // 메모리 누수 방지
    }
}
728x90
반응형