[Android] 데이터 바인딩

김동근·2021년 1월 27일
0

Android Udemy 강의

목록 보기
1/2
본 시리즈는 Udemy의 Android Jetpack, Clean Architecture & Testing Masterclass 강의를 정리한 것입니다.

데이터바인딩

기존에는 xml에서 view를 끌어올때에는 findviewbyid()함수를 사용하였다. 그 이후에 ktx를 이용하여 가져오는 것도 가능하였지만 이제는 data binding을 사용할 것을 구글에서 권장하고 있다.

findviewbyid()함수는 app의 모든 view 중에서 해당 id를 가진 view를 가져오는 작업을 1프레임마다 실행하기 때문에 규모가 큰 앱에서는 성능저하 문제를 가져올 수 있다.

원래 내가 알고 있기로는 view binding을 이용해서 findviewbyid()함수를 대체할 수 있지만 data binding을 통해서도 대체 가능한 것 같다.

data binding은 xml에서 태그로 감싸져 있는 것들만 가져 올 수 있기 때문에 가져올 액티비티의 전체를 태그로 감싸줄 필요가 있다.

![https://velog.velcdn.com/images%2Fasdsa2134%2Fpost%2F41e99504-60b6-4885-9a5a-72bce152f33d%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fasdsa2134%2Fpost%2F41e99504-60b6-4885-9a5a-72bce152f33d%2Fimage.png)

data binding의 장점으로는 위와 같은 것들이 있다고 한다.

findviewbyid()와 data binding의 큰 차이점은 findviewbyid()는 run time에 실행되고 data binding은 compile time에 실행되기 때문에 오류가 있을 시 컴파일 단계에서 잡아낼 수 있다.(오류 코드가 무엇인지 알 수 있다)

나중에 view binding을 배우게 되면 둘의 차이점을 더 자세히 알 수 있을 듯 하다.

data binding 사용법

  1. 앱수준 build.gradle에 가서 android안에 설정 작성
android {
  dataBinding{
  	enabled = true
 	}
}

최신 버전은

android {
	buildFeatures{
		dataBinding = true
	}
}
  1. 가져오고자 하는 view가 있는 액티비티로 가서 태그로 감싸기

  2. 액티비티에 해당하는 .kt 혹은 .java 파일로 가서 binding 객체 만들기

private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
  }

활용

binding.(view id) 형태로 view를 불러올 수 있다.
binding.apply{} → apply 안에서는 binding을 객체를 사용하지 않아도 자동으로 적용됨

binding.nameText.text = "hi"
binding.apply{
	nameText.text = "hi"
}

태그를 이용해서 .kt 에서 xml로 데이터를 보낼 수 도 있다.

textview의 text를 지정하는 기존 방식

var name : String = "kim"
var email : String = "wofo@gmail.com"

binding.nameText.text = name
binding.emailText.text = email

태그를 이용한 방식

xml

<data>
	<variable>
		name="student"
		type="Student" // 미리 만들어 둔 데이터 클래스
</data>

...

<TextView
	...
	android:text="@{student.name}
	...
/>
.kt

binding.student = getStudent()

...

private fun getStudent() : Student{
	return Student(1, "Alex", "alex@gmail.com")
}
Student.kt

data class Student(
	var id:Int,
	var name:String,
	var email:String
)
profile
김동근

0개의 댓글