티스토리 뷰

Mobile/Android

[Android] ViewModel

춘햄 2022. 3. 27. 13:12

직전 포스팅인 Navigation Drawer 을 다루면서 생성한 Fragment 객체는 이전에 봤던 Fragment객체의 형태와 많이 달라있었다. 

 

이전처름 Fragment객체를 생성한 뒤, Fragment클래스를 상속받아서 inflate해주는 코드 한 줄만 구성한 것이 아닌, 아래와 같이 ViewModel 객체를 상속 받은 FragmentModelView클래스를 Fragment 클래스와 함께 생성하였다. 

 

◎SlideshowViewModel.java

package com.example.callenge.ui.slideshow;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class SlideshowViewModel extends ViewModel {

    private MutableLiveData<String> mText;

    public SlideshowViewModel() {
        mText = new MutableLiveData<>();
        mText.setValue("This is slideshow fragment");
    }

    public LiveData<String> getText() {
        return mText;
    }
}

◎SlideshowFragment.java

package com.example.callenge.ui.slideshow;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.example.callenge.R;

public class SlideshowFragment extends Fragment {

    private SlideshowViewModel slideshowViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        slideshowViewModel =
                new ViewModelProvider(this).get(SlideshowViewModel.class);
        View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
        final TextView textView = root.findViewById(R.id.text_slideshow);
        slideshowViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }
}

 


위 코드는 프래그먼트 혹은 액티비티 간에 데이터를 전달할 때,  onSaveInstanceState() 메서드를 사용하여 onCreate()의 번들에서 데이터를 복원하는 기법이 데이터가 복잡하거나 직렬화/역직렬화가 불가능한 데이터인 경우 사용하는데 한계가 있기 때문에 아예 데이터의 소유권을 UI 컴포넌트에서 분리하기 위해 ViewModel을 사용한 코드이다.

 

ViewModel 객체에 대한 자세한 Reference는 구글의 안드로이드 공식 문서에 잘 나와있다.

 

Android ViewModel Class Reference

'Mobile > Android' 카테고리의 다른 글

[Android] 브로드캐스트 수신자 이해하기  (0) 2022.03.30
[Android] Service 1: Service 이해하기  (0) 2022.03.29
[Android] Navigation Drawer  (0) 2022.03.27
[Android] View Pager2  (0) 2022.03.25
[Android] Tab 2: 하단 Tab 구성  (0) 2022.03.24
Comments