일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 커피추천
- 원달러환율
- 홈플러스
- 믹스커피
- 원스휴먼 황금양털파밍
- 믹스커피추천
- 원스휴먼 황금양
- 일론머스크
- 2차계엄
- 원스휴먼 요리
- 원스휴먼 사료
- 계엄령 외신반응
- 비상계엄령
- 1203계엄령
- 홈플러스 시그니처 모카골드믹스커피
- 계엄령
- 원스휴먼 레시피 파밍
- 시그니처
- 원스휴먼 먹이
- 원스휴먼 레시피
- 2차 비상계엄
- 원스휴먼 동물
- 국방부
- 원스휴먼 황금양 구하기
- 원스휴먼 쿠폰
- 윤석열
- 유광버섯 통조림
- 원스휴먼 스타크롬
- 레시피 파밍
- Today
- Total
0101011001010111
1-1 뷰바인딩(View Binding) 본문
뷰 바인딩 (View Binding)
대부분의 경우 View Binding이 findViewById를 대체합니다.
이전, findViewById 시절....
▼버튼이 눌리면 텍스트가 바뀌는 코드(findViewByID 사용)
package com.example.appdevelopmentskilledlecture
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn = findViewById<Button>(R.id.myButton)
btn.setOnClickListener {
val tv_name = findViewById<TextView>(R.id.myTextView)
tv_name.text = "버튼이 눌렸어요.!!"
}
}
}
뷰 바인딩은, findViewById 대신 좀 더 편하게 위젯을 연결 시켜주는 기능이다!
뷰바인딩 :
- 뷰 바인딩 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다
- 모듈에서 사용 설정된 뷰 바인딩은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성합니다.(자동생성)
- 바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조가 포함됩니다.
- 대부분의 경우 뷰 바인딩이 findViewById를 대체합니다.
- 뷰바인딩에 대한 공식사이트 설명
https://developer.android.com/topic/libraries/view-binding?hl=ko
사용방법(공식사이트 요약)▼
android {
...
viewBinding {
enabled = true
}
}
▲1. viewBinding 요소를 build.gradle 파일에 복사합니다.
위치는, 제일 상단으로 올리면 android{ .... } 이 있을 텐데 여기 안 제일 밑에 넣어주도록하자
넣고나서 씽크해주기 ! (나처럼 빨갛게 뜬다면 알트 + 엔터 누르고 싱크해주기!)
잠깐!! 저의 경우 이게 되질 않아서 한참 찾았는데,
튜터님께서 알려주심
안드로이드 스튜디오 버전이 4.0이상이라면 ▼
buildFeatures {
viewBinding = true
}
이걸로 써줘야한다!
안드로이드 스튜디오 버전이 3.6~4.0이라면▼
viewBinding {
enabled=true}
만약 3.6미만이라면
▶뷰바인딩을 사용할 수 없다... 안드로이드 버전을 높은 걸 쓰자..!!
빌드 그래들 하고나서 싱크 필수우우ㅜ우우우우우!!
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
▲2. Xml에는 당연히, 아이디를 줘야한다.
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
▲ 3. 코틀린 코드에서 바인딩 선언(.kt)
+ 바인딩에다가 inflate 선언
+ setContentView() < 소괄호안에 바인딩 한 루트를 넣어주시면 됩니다.
+해당 코드를 한 줄씩 해설하겠습니다.
▼ 대충 이런느낌으로 돌아가는구나 ~ 하고 읽어만 보자
private lateinit var binding: ResultProfileBinding
- binding이라는 이름의 변수를 선언합니다. 이 변수는 ResultProfileBinding 타입으로, 초기화는 나중에 lateinit 키워드를 사용하여 이루어집니다. ResultProfileBinding는 Android ViewBinding 기능을 사용할 때 생성되는 클래스로, 해당 액티비티의 XML 레이아웃에 있는 뷰와 코드를 연결해주는 역할을 합니다.
binding = ResultProfileBinding.inflate(layoutInflater)
- ResultProfileBinding 클래스의 inflate 메서드를 사용하여 XML 레이아웃 파일을 실제 뷰 객체로 변환합니다. 여기서 layoutInflater는 액티비티에서 제공하는 시스템 서비스로, XML 레이아웃을 실제 뷰 객체로 만드는 데 사용됩니다. binding 변수에 결과를 할당하여 이후에 뷰 요소에 쉽게 액세스할 수 있게 합니다.
val view = binding.root
- 바인딩 객체에서 루트 뷰를 가져와 view 변수에 할당합니다. 이 루트 뷰는 XML 레이아웃의 최상위 뷰를 나타냅니다.
setContentView(view)
- setContentView 메서드를 사용하여 액티비티에 위에서 가져온 뷰를 설정합니다. 이렇게 하면 해당 뷰가 액티비티의 콘텐츠로 표시됩니다.
이게 어디에 들어가냐 하면
이렇게 들어가는데
이 3줄은 자주 사용하는 것이니 외워두도록 하자.!
(항상 이렇게 씀 똑같은 코드임)
▼4.뷰바인딩을 쓸 때에는
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
binding.아이디 해서 부르면 됩니당
예를들어보자면,
이렇게 바로 사용하면 된다!
아까처럼 클릭시 문구를 바꾸는 거다.
지금은 findViewById와 무슨 차이가 있지 ? 뭐가 더 간편한거지? 비슷한데?
생각이 들 수 있지만, 나중에 코드가 점점 길어질 수록
이 ViewBinding은 유용함을 느낄 수 있을 것이다!!
▶findViewById와의 차이점
1) NullSafe
- 뷰 바인딩은 뷰의 Direct References 즉 직접 참조를 생성하므로 유효하지 않은 뷰ID로 인해 null포인터 예외(NPE)가 발생 할 위험이 없다.
- 즉, 레이아웃에 아직 생성되지 않은 뷰의 참조를 얻어(null상태)해당 뷰의 속성을 사용하려 할 때 발생하는 NPE를 방지 한다는 것이다.
- 레이아웃의 일부 구성에만 뷰가 있는 경우 결합 클래스에서 참조를 포함하는 필드가@Nullable로 표시된다.
2) Type safety
- 각 바인딩 클래스에 있는 필드의 유형이 XML파일에서 참조하는 뷰와 일치한다.
- 즉,클래스 변환 예외가 발생할 위험이 없다.
- 쉽게말해 타입을 가지고 있기 때문에 imageView.text같이 타입이 다른 경우 발생하는 오류를 방지 할 수 있다.
- ㄴ (막 findViewById는 <> 이 괄호 안에 Button이라든지 TextView라든지 타입을 그동안 넣어줬다. 이런거 안넣어줘도 되기 때문에 틀릴 일이 없다!
결론 : 이런 장점들 때문에, 요즘은 findViewById대신 ViewBinder를 사용하고 있다!
'Kotlin > 안드로이드_[숙련]앱개발' 카테고리의 다른 글
1-2.AdapterView_GridView_버튼클릭시 이벤트! (0) | 2023.08.25 |
---|---|
1-2.AdapterView_GridView_imageVersion (0) | 2023.08.25 |
1-2.AdapterView_GridView_textVersion (0) | 2023.08.24 |
1-2.AdapterView_ListView (0) | 2023.08.24 |
1-2.AdapterView&Adapter는 뭘까? (0) | 2023.08.22 |