0101011001010111

1-1 뷰바인딩(View Binding) 본문

Kotlin/안드로이드_[숙련]앱개발

1-1 뷰바인딩(View Binding)

[진주] 2023. 8. 22. 15:46
728x90
반응형

뷰 바인딩 (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 파일에 복사합니다.

요기 빌드.그래들에 Module<< 여기에 넣어주는거다.

위치는, 제일 상단으로 올리면 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를 사용하고 있다! 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형