[Android] ViewBiding, DataBinding

민채·2024년 2월 15일
0

Android

목록 보기
2/16

ViewBinding이나 DataBinding을 사용하기 전에는 Activity, Fragment findViewById()를 사용해 view의 id를 찾아주었다.
그런데 이렇게 하면 view가 많아지면 코드가 길어지고 id를 잘못 쓰면 오류가 나고.. 여러모로 불편했다.

학교 수업을 들을 때는 findViewById()만 사용했는데 여러 플젝을 진행하면서 이렇게 편리한 방법이 있는걸 알았다!

처음에 공부하면서 블로그에 정리해서 올려야지~ 했는데.. 귀찮아서 미루다가 이제서야 정리한다..ㅎㅎ🫣

ViewBinding

  • ViewBinding을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있음
  • ViewBinding은 각 XML 레이아웃 파일의 Binding 클래스를 생성
  • Binding 클래스의 인스턴스에서 레이아웃에 ID가 있는 모든 뷰의 직접참조 가능

장점

  • null-safety : findViewById로 없는 id의 view를 찾아오는 경우 null 반환하는 문제 해결 (뷰를 직접참조하기 때문)
  • type-safety : 정확한 View 타입을 찾아 맵핑 (반환 타입이 일치하지 않을 때 exception이 발생하는 문제 해결)
  • 뷰 개수대로 코드를 추가 할 필요 없음

사용 방법

build.gradle 파일에 해당 코드 추가

android {
	...
	viewBinding {
		enabled = true
	}
}
    

Activity에서 ViewBinding 사용

class MainActivity : AppCompatActivity() {
	private lateinit var binding: ActivityMainBinding // onCreate()에서 초기화하기 위해 lateinit으로 선언

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // ViewBinding 객체 초기화
        // inflate()는 xml에 있는 view를 객체화 해주는 역할
        // 객체화 해주는 과정에서 layoutInflater가 필요
        binding = ActivityMainBinding.inflate(layoutInflater)
        
        setContentView(binding.root) // 레이아웃을 inflating 해줌
    }
}

Fragment에서 ViewBinding 사용

class MainFragment : Fragment() {
	override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    	val binding = FragmentSettingBinding.inflate(inflater, container, false)
    
    	return binding.root
	}
}

view에 접근

binding.textView.text = "Hello, World!" // TextView에 텍스트 설정

DataBinding

UI 요소와 데이터를 프로그램적 방식으로 연결하지 않고, 선언적 형식으로 결합할 수 있게 도와주는 라이브러리

장점

  • 파일을 단순화 시키고 유지보수가 쉬움
  • 메모리 누수 및 NullPointerException 방지
  • 앱 성능 향상

사용 방법

build.gradle 파일에 해당 코드 추가

android {
	...
	dataBinding {
		enabled = true
	}
}
    

User.kt

class User {
	val name: String,
    val age: String,
}

activity_main.xml
<layout> 태그로 감싸줘야 한다.

<?xml version="1.0" encoding="utf-8"?>
<layout>
	<data>
    	<variable
        	name="user" // 레이아웃에서 사용할 변수 이름 (직접 지정)
      		type="com.example.android-study" /> // xml과 연결될 데이터 (변수 타입)
    </data>
        
    <LinearLayout
    	android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
                    	
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" // 변수 사용
            />
            
        <TextView
            android:id="@+id/tv_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.age}" />
     </LinearLayout>
</layout>
    

MainActivity.kt

class MainActivity : AppCompatActivity() {
	private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        
        binding.user = User("apeach", "5") // xml에서 만든 user 변수에 접근
    }
}

ViewBinding과 DataBinding의 차이점

ViewBindingDataBinding
단방향 바인딩 (양방향 바인딩 지원 X)양방향 바인딩
속도가 더 빠르고 효율적임빌드 시간이 보다 오래 걸리고 코드 구현이 어려움
태그를 사용하지 않고 자동으로 모든 layout에 대해 binding class가 생성 태그를 사용해 binding class 를 생성, TAG를 삽입
코드에 view를 bindingview를 binding 하는 것뿐만 아니라 data를 직접 view에 binding함

참조

profile
코딩계의 떠오르는 태양☀️

0개의 댓글