1. findViewById
<Button
android:id="@+id/btn1"
android:text="btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn2"
android:text="btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
위와 같은 xml코드가 있다고 가정해보자.
btn1, btn2 가 써져있는 버튼 두개가 생길 것이다.
클래스에서 위의 버튼의 텍스트를 어떻게 변경할까?
맨 처음 생각할 수 있는 것은 findViewById이다.
val btn1 : Button = findViewById(R.id.btn1)
btn1.text = "abcd"
val btn2 : Button = findViewById(R.id.btn2)
btn2.text = "abcd"
위의 코드에서는 버튼이 2개라 이 정도로 끝나지만 만일 바꾸고 싶은 버튼이 100개라면
적어도 200줄의 코드를 더 적어야한다.
이렇게 하면 가독성이 떨어지는 문제가 발생한다.
따라서 Kotlin Extensions이 등장했다.
gradle파일에
id 'kotlin-android-extensions'
위의 코드 한줄만 추가해주면 사용할 수 있다.
btn1.text = "abcd"
btn2.text = "abcd"
Kotlin Extensions를 사용하면 위의 코드처럼 간단히 구현할 수 있다.
하지만 위의 코드에는 위험성이 크다.
예를 들어, 메인액티비티 말고 다른 액티비티에 btn3이 있다고 가정해보자.
btn3은 다른 액티비티 클래스에서 접근을 해야하지만 위의 코드처럼 접근이 쉬워진다면
메인엑티비티에서 btn3을 접근할 위험이 있다.
따라서 구글에는 이를 사용하지 말라고 권장하고 있다!!!
그래서 등장한 것이 ViewBinding이다!!
2. ViewBinding
먼저 gradle파일에 다음 코드를 추가하자!
buildFeatures{
viewBinding = true
}
2-1. 액티비티에서의 viewbinding
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
2-2. 프래그먼트에서의 viewbinding
private var _binding : FragmentTestBinding?= null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
_binding = FragmentTestBinding.inflate(inflater, container, false)
val view = binding.root
binding.fragmentText.text = "이거는 fragment text"
return view
}
액티비티와 프래그먼트에서의 뷰바인딩 사용법이 위와 같이 조금 차이가 있다.
이렇게 뷰바인딩을 사용하면 findViewById와는 다르게 한 번만 선언해주면
binding. 으로 접근 가능하다!!!!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] Activity/Fragment 의 ViewModel 공유 (0) | 2022.08.12 |
---|---|
[JETPACK개론] ViewModel ? (0) | 2022.08.11 |
[JETPACK개론] View,DataBinding + Adapter (0) | 2022.08.10 |
[JETPACK개론] DataBinding 과 data class (0) | 2022.07.26 |
[JETPACK개론] 들어가며 (0) | 2022.07.23 |