기존에는 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] (번역) Comparing Kotlin Coroutines with Callbacks and RxJava (0) | 2021.08.20 |
---|---|
[Android] 스마트폰 내장 DB를 사용하기 위한 Room 2탄 (0) | 2021.08.13 |
[Android] 스마트폰 내장 DB를 사용하기 위한 Room 1탄 (0) | 2021.08.08 |
[Android] 디자인 패턴 (MVC, MVP, MVVM) (0) | 2021.08.03 |
[Android] FCM Data 와 Notification (0) | 2021.07.23 |
댓글