Activity와 Layout을 결합하는 대표적인 방법
1. findViewById
- Android 초기부터 사용되었으며 별다른 설정없이 사용 가능하다.
- 안드로이드 리소스를 관리하는 R 클래스를 통해 View를 찾는다.
- 자동으로 형변환을 해주는 기능이 없어 직접 형변환을 해줘야 한다.
- 연결된 Layout에 존재하지 않은 View여도 앱을 실행하기 전까지 오류를 발생시키지 않는다.
2. ViewBinding
- 최근 가장 많이 사용되는 방법으로 XML 파일을 해석해서 객체로 변환한다.
- 자동으로 형변환을 해주어 별다른 형변환을 할 필요 없다.
- 연결된 Layout에 존재하는 View만을 가져올 수 있다.
- 초기 설정이 필요하다.
3. DataBinding
- XML 파일과 데이터를 직접 결합하는 방법이다.
- 디자인 패턴과 결합해서 사용한다.
위의 3가지 방법 중 View Binding을 알아보도록 하겠다.
View Binding(뷰 바인딩)이란?
뷰 바인딩(View Binding) 은 말그대로 뷰를 바인딩(Binding: 묶어놓다.) 하는 것인데, 레이아웃 XML 파일에 대한 액티비티 클래스를 정의하지 않고 자동적으로 뷰(View)에 대해 커넥션을 생성해주는 기능을 말한다.
build.gradle에서 뷰 바인딩 속성을 활성화시키면 해당 모듈에 있는 각 XML 레이아웃 파일에 대한 바인딩 클래스가 자동적으로 생성된다.
ex) 액티비티 레이아웃 파일명으로 만들어지는 바인딩 클래스명
activity_main.xml ⇒ ActivityMainBinding
View Binding(뷰 바인딩) 사용 이유
1. 일일이 View를 찾아 findViewBy를 사용할 필요가 없으며, 형변환을 할 필요 없다.
2. 레이아웃 내에 View만을 찾아 정확한 view 타입을 매핑해, Type-Safe를 보장한다.
3. 레이아웃에 없는 id를 접근 했을 때의 NullPointerException을 방지해, Null-safe를 보장한다.
4. 오류가 나면 런타임이 아닌 컴파일시 빌드 오류를 알려준다.
View Binding(뷰 바인딩) 설정 및 사용
코틀린 코드에서 레이아웃 객체를 조작하기 위해서 뷰 바인딩을 한다.
1. build.gradle 파일 수정
app/build.gradle (Module: ) => viewBinding 추가
android {
...
viewBinding{
enabled = true
}
}
우측 상단 Sync Now 클릭
2. MainActivity.kt 수정
package com.til.binding_ex
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.til.binding_ex.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var viewBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
viewBinding.tvText.text = "456"
}
}
코드 해석
private lateinit var viewBinding: ActivityMainBinding
레이아웃 정보가 클래스로 만들어지기 때문에 해당 클래스를 통해서 만들어진 객체를 담을 수 있는 변수를 생성한다.
최대한 빠른 시일 내에 초기화 하겠다는 뜻의 lateinit var을 사용해 변수를 생성한다.
* ViewBinding Naming (네이밍) *
액티비티 레이아웃 파일명으로 만들어지는 바인딩 클래스명 => 자동 Naming
언더바( _ ) 가 사라지고 camel case로 변경이 된다.
activity_main.xml ⇒ ActivityMainBinding
viewBinding = ActivityMainBinding.inflate(layoutInflater)
inflate()는 XML 파일을 읽어와 해석하겠다는 의미이다.
객체화한 뷰를 해석해서 읽어와 객체화를 해주는 layoutInflater가 필요하다.
layoutInflater은 액티비티(Activity)에서 기본적으로 제공해준다.
setContentView(viewBinding.root)
root라는 의미는 activity_main.xml의 맨 위에 있는(root) Layout을 의미한다.
root를 가져오면 activity_main.xml의 root 레이아웃 아래 작성되어 있는 내용도 함께 가져오게 된다.
해당 명령어를 통해 해당 activity를 명령어가 작성된 MainActivity.kt에서 사용할 수 있게 된다.
3. ViewBinding 사용
레이아웃 파일에 생성해둔 뷰를 이제는 findViewById가 아닌 "binding.[뷰ID]"로 접근할 수 있다.
binding.tvTextView.text="ID가 tvTextView인 뷰 text 수정하기"
'TIL > Android' 카테고리의 다른 글
[Android] 액티비티(Activity) 간의 통신 / 인텐트(Intent)로 데이터 주고 받기 / 액티비티 추가 생성하기 (0) | 2022.11.11 |
---|---|
[Android] 인텐트(intent)란? / 컨텍스트(Context) /명시적 인텐트, 암시적 인텐트, 인텐트 필터 (0) | 2022.11.10 |
[Android] 레이아웃(Layout) - LinearLayout, TableLayout, RelativeLayout (0) | 2022.11.09 |
[Android] 액션바 로고 아이콘 설정 + AVD 앱 타이틀 설정 / actionbar에 앱 아이콘 삽입하기 (0) | 2022.10.20 |
[Android] 이미지 뷰(ImageView), 이미지 버튼(ImageButton) (0) | 2022.10.05 |
[Android] 계산기 앱 만들기 (0) | 2022.10.05 |
댓글