본문 바로가기
Programming/Android

[MVVM] 데이터 바인딩 data-binding (Activity, fragment)

by soccerman 2020. 11. 3.
반응형

데이터바인딩은 레이아웃에 있는 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

viewModel을 MainViewModel클래스에서 정의했다.

이를 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

반응형

댓글