데이터바인딩은 레이아웃에 있는 UI 컴포넌트를 앱에 있는 데이터 소스에 연결하는 것이다.
일반적으로 Mainactivity에서 UI에 어떤 값을 띄울 때 아래와 같이 UI framework method를 call하게 된다.
findViewById를 계속해서 사용하는 것은 어플리케이션을 느리게 만들 뿐만 아니라, id의 인수로 잘못된 값이 들어갔을 때 runtime에서 crash가 날 수도 있기 때문에 위험하다.
환경설정(build.gradle)
1
2
3
4
5
6
|
android {
...
buildFeatures {
dataBinding true
}
}
|
cs |
MainActivity
1
2
3
4
5
6
7
8
9
|
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this,
R.layout.activity_main)
binding.lifecycleOwner = this
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.viewModel = viewModel
|
cs |
binding 객체를 선언하고 이를 해당 레이아웃과 연결한다. binding객체의 viewmodel에 Mainactivity에서 선언된 viewmodel을 넣어준다.
xml
이를 xml상에서 data source variable로 정의해주면 xml에서 viewmodel값을 활용하여 UI컴포넌트에 값을 넣을 수 있다.
람다를 활용하면 onclick event에서 viewmodel 함수를 실행시킬 수도 있다.
이처럼 데이터바인딩을 활용하면, xml상에서 UI컴포넌트들에 viewmodel의 값을 넣고 혹은 viewmodel로 값을 받아오거나 함수를 실행시킬 수 있다.
이에 따라 UI 프레임워크 call이 줄어들어 어플리케이션의 성능이 개선되고, MainActivity에서의 코드가 단순해져 유지보수에 이점이 있다.
하지만 위의 예제와 같이 todo 즉 할일을 저장하는 간단한 어플에서는 활용방법이 쉽게 포착이 되는데 조금 복잡한 어플리케이션에서는 어떻게 잘 활용할 수 있을지 감이 잘 잡히지 않는다. UI컴포넌트 업데이트와 메인쓰레드에서의 특정 이벤트가 연관되어 있으면 어떻게 처리할지 잘 모르겠다.
Fragment에서 binding
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class LoginFragment : Fragment() {
lateinit var bind : FragmentLoginBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
bind = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false)
return bind.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
bind.viewModel = viewModel
}
}
|
cs |
***
Two-way databinding
참고자료
developer.android.com/topic/libraries/data-binding/start
codelabs.developers.google.com/codelabs/android-databinding#0
'Programming > Android' 카테고리의 다른 글
[네이버 길찾기 API] Direction 5 API with Kotlin, Retrofit2 (11) | 2020.11.20 |
---|---|
[안드로이드] 카카오맵 API UnsatisfiedLinkError (0) | 2020.11.09 |
[Kotlin] 안드로이드 키해시 값 얻는 두가지 방법 (0) | 2020.11.02 |
[Android] 프레그먼트 Fragment 란? (0) | 2020.10.28 |
댓글