본문 바로가기
TIL, WIL(일기)

230828 뷰 바인딩

by 도슬 2023. 8. 28.

1. View Binding : xml 레이아웃 파일에 정의된 뷰 요소들을 쉽게 쓸 수있다.

buildFeatures{
    viewBinding true
}

ㄱ. 먼저 gradle Scripts/ build.gradle(Modul.app) 에다가 위 코드를 써주고 Sync를 꼭 해준다(뷰바인딩 라이브러리 추가)

 

class MainActivity : AppCompatActivity() {
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    private lateinit var applelauncher: ActivityResultLauncher<Intent>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    }}

 

ㄴ. 우선 상수(val)로 변수이름 하나 선언해주고 lazy를 이용한다.

: 필요한 경우에만 초기화되고 그렇지  않으면 초기화 되지않는다.(성능↑, 안정성(런타임오류)↑, 가독성↑)

ㄷ. ActivityMainBinding : 현재 클래스와 연동되는 xml파일의 이름+Binding (여기서 xml파일의 이름은 : activity_main, 언더바는 제외)  , 레이아웃의 파일이름을 기반으로해서 생성되는 클래스

ㄹ. inflate(layoutInflater) : layoutInflater를 통해서 해당 xml 레이아웃파일을 실제 뷰객체로 변환한다.

ㅁ. 정리하자면 binding이라는 변수에 ActivityMainBinding라는 xml파일을 기반으로 생성된 클래스의 뷰객체를 담는다.

ㅂ. 예를들어 binding이라는 변수로 bind.btn , bind.textView, bind.editTextView ( 여기서 btn, textView, editTextView는 바인딩 된 xml 내부에있는 버튼,텍스트뷰,에딭 텍스트뷰 요소들의 id이다.) 처럼 뷰 요소들의 id만 알면 이렇게 간단하게 쓸 수 있다.

ㅅ. 기존의 setContentView(xml파일이름) 대신 setContentView(binding.root)을 써준다 .

- binding.root : 바인딩된 해당 xml파일의 최상위 레이아웃뷰(root)

- setContentView :  화면에 표시할 레이아웃을 설정 하는데 보통 한 번 호출해서 쓰고, 동일한 엑티비티에서 다른 레이아웃으로 변경하는 일은 거의 없다.  보통 onCreate내에서 수행되고 한번 호출이 되는데 생명주기와 관련없이 반복해서 호출하면 안정성에 문제가 생길 수 있다.

 

(예) 

<TextView
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxLines="2"
    android:ellipsize="end"
    android:text="..."
    android:textSize="18sp"
    />

<TextView
    android:id="@+id/address"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textSize="15sp"/>

<TextView
    android:id="@+id/price"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textSize="18sp"
    android:textStyle="bold"/>

 

ㅇ. 위 xml파일을 기반으로 생성된 클래스의 뷰객체를 담은 변수 binding을 가지고

val name = binding.name
val address = binding.address
val price = binding.price

ㅈ. 이런식으로 해당 뷰요소들의 id를 이용해서 binding을가지고 쉽게 접근할 수 있다.