오늘도 더 나은 코드를 작성하였습니까?

데이터 바인딩(DataBinding) 본문

Android Jetpack Architecture/DataBinding

데이터 바인딩(DataBinding)

hik14 2020. 8. 5. 04:12

왜 DataBinding 이 필요할까?

MVVM 패턴에서 DataBinding 및 LiveData(Observable)을 이용하여 MVP 패턴에서 View와 Presenter 간의 높은 의존성을 약하게 만들어야 되었다.

 

ViewModel은 View에 표현될 데이터를 관리 및 비지니스 로직을 처리한다.

이 데이터를 View과 관찰하고 하고 있다가 비즈니스 로직에 따라 데이터가 변경이 되면 즉시 반영할 수 있다.

 

ViewModel이 View에 대한 의존성을 갖지 않고 느슨하게 연결되려면 DataBinding가 필수적이다. 

 

 

데이터 바인딩 기본.

모듈 수준 그레이들 파일에 build.gradle(Moudule: app) 데이터 바인딩 허용.

    android {
        dataBinding {
            enabled = true
        }
    }

1. 바인딩할 뷰 (layout resource). xml의 최상위 태그를 <layout> 태그로 지정한다.

그러면 바인딩 클래스가 자동으로 생성된다. 

예를 들면 activity_main_.xml 이라면  ActivityMainBinding 클래스가 자동생성이 된다.

 

2. <data> <variable> 태그를 통해 변수를 선언하면 자동 생성된 바인딩 객체의 멤버 변수로 데이터 바인딩이 된다.

 

바인딩 클래스는 내부에서 각 뷰 객체 를 미리 findViewById()를 호출한 결과를 캐싱해두기 때문에 Activity 또는 Fragment와 같은 UI 기반 클래스에서 View에 접근할 수 있다.

 

* findViewId() 의 호출은 View의 계층의 깊이가 클수록 비용이 많이드는 연산이다. 

* Activity 또는 fragment에서 findViewById 가 없어져서 보일러 플레이트 코드를 줄일 수 있다.

 

3. 바인딩 표현식 @{viewModle. XXXX }을 통해 View에 데이터를 전달할 수 있다. 

 

 

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    
    <data>
        <variable
            name="viewModel"
            type="패키지명.ViewModel"/>
    </data>
    
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

public class MainActivity extends AppCompatActivity {

   private static ActivityMainBinding mBinding;

   private ViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 바인딩클래스 참조 얻기.
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        
        // 바인딩 클래스를 이용하여 button 참조 얻기
        Button button =mBinding.button;
        
        // ViewModel 바인딩 하기.
        viewModel = new ViewModelProvider(this,
                ViewModelProvider.AndroidViewModelFactory
                .getInstance(this.getApplication()))
                .get(ViewModel.class);
                
        mBinding.setViewModel(viewModel);
    }
}

 

 

참고자료 (바인딩객체를 참조 하는 여러 방법)

상황과 UI기반 클래스에 따라 살짝 다른 방법을 사용한다.