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

DataBinding과 LiveData 본문

Android Jetpack Architecture/LiveData

DataBinding과 LiveData

hik14 2020. 8. 18. 15:47

databinding의 가장 중요한 목적은 LiveData(Observable)을 이용하여 MVP 패턴에서 View와 Presenter 간의 높은 의존성을 약하게 만들어야 되었다.

 

또한 안드로이드 구성요소의 생명주기를 인식할 수 있는 LiveData를 이용한다면 생명주기에 대한 수동 처리 없이 데이터 변경에 따른 UI를 변경을 반응형으로 프로그래밍할 수 있다.

 

*안드로이드 스튜디오 3.1 이상 버전부터는 Observable 필드의 사용보단 LiveData의 사용을 데이터 바인딩에서 권장된다.

 

LiveData와 Binding클래스를 같이 사용하려면 바인딩 클래스에 LifecycleOwner를 명시하여 생명주기를 인식하고 생명주기를 인식하고 이에 따라 LiveData가 트리거 될 수 있도록 해야 된다.

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private UserViewModel mUserViewModel;
    private ActivityMainBinding mBinding;

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



        mUserViewModel = new ViewModelProvider(this,
                ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication()))
                .get(UserViewModel.class);
                
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        
        mBinding.setViewModel(mUserViewModel);
        mBinding.setLifecycleOwner(this);
        .
        .
        .
    }

 

LiveData를 사용하면서 Two-way dataBinding 사용하기

 

setter 프로퍼티 접근자를 통해서 양방향 데이터 바인딩의 구현과 LiveData의 사용을 동시에 할 수 있다.

 

setter생성 시 주의할 점

 

1. 메서드의 이름과 바인딩 표현식에서 참조하는 멤버의 이름이 일치해야 된다.

 

2. 메서드의 매개변수 타입이 LiveData의 제네릭 타입과 일치해야 된다.

 

예시)

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mBinding;
    private UserViewModel viewModel;

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

        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        viewModel = new ViewModelProvider(this,
                ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication()))
                .get(UserViewModel.class);

        mBinding.setLifecycleOwner(this);
        mBinding.setViewModel(viewModel);
    }
}
public class UserViewModel extends AndroidViewModel {

    public UserViewModel(@NonNull Application application) {
        super(application);
    }

    private MutableLiveData<String> name = new MutableLiveData<>();

    public MutableLiveData<String> getName() {
        return name;
    }

    public void setName(MutableLiveData<String> name) {
        this.name = name;
    }
}
<?xml version="1.0" encoding="utf-8"?>

<layout>
    <data>
        <variable
            name="viewModel"
            type="com.professionalandroid.apps.databindingandlivedata.UserViewModel" />
    </data>

    <LinearLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.name}"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={viewModel.name}"
            />
    </LinearLayout>
</layout>

 

'Android Jetpack Architecture > LiveData' 카테고리의 다른 글

LiveData( MediatorLiveData )  (0) 2020.08.18
LiveData 변환( Transformation class )  (0) 2020.08.17
LiveData 사용 하기  (0) 2020.08.15
LiveData 개요와 이점  (0) 2020.08.15