[android] MVVM – 1. 기초

https://realm.io/kr/news/eric-maxwell-mvc-mvp-and-mvvm-on-android/ 를 보니 MVVM이 좋아 보였다. MVVM에 대해 말은 몇 번 들었는데, 익숙하지 않으니 잘 안 쓰게되고, 잘 안 쓰니 계속 이름을 들어본 상태로 남게 되는게 아까워서 예제를 만들어 봤다.

 

안드로이드 데이터 바인딩에 관한 내용은 https://developer.android.com/topic/libraries/data-binding/index.html?hl=ko 에 나와있다. 가끔 찾을 수 있는 꽤 잘 설명된 안드로이드 개발자 페이지다 ㅋㅋ

 

Android Studio 2.3 으로 작업했다.

 

app/build.gradle 에 아래의 구문을 추가한다.

android {
  .
  .
    dataBinding.enabled true
  .
}

 

 

앞으로 작업할 뷰모델의 기초를 만든다.

public interface BaseViewModel {
  void onCreate();

  void onResume();

  void onPause();

  void onDestroy();
}

예제를 만들면서 느꼈는데 BaseViewModel은 interface가 아니라 class 로 만드는 게 나을 것 같다.

 

 

 

간단한 뷰모델을 만든다. 일단은 앱을 실행하면 아무 글자나 나오게 바꿨다.

public class MainViewModel implements BaseViewModel {
  public final ObservableField<String> helloText = new ObservableField<>();

  @Override
  public void onCreate() {
    helloText.set("hello!");
  }

  @Override
  public void onResume() {}

  @Override
  public void onPause() {}

  @Override
  public void onDestroy() {}
}

 

 

activity_main.xml  이렇게 바꾼다. variable – name에 지정한 이름을 이 화면에서 사용하게 된다. 자세한 내용은 저 위의 구글 데이터 바인딩 링크를 보면 된다.

<?xml version="1.0" encoding="utf-8"?>
<layout>

  <data>

    <variable
      name="model"
      type="kr.susemi99.testmvvm.view_models.MainViewModel"/>
  </data>

  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@{model.helloText}"
      tools:text="Hello World!"/>
  </LinearLayout>
</layout>

 

 

MainActivity를 이렇게 바꾼다. setContentView()는 지워도 된다.

public class MainActivity extends AppCompatActivity {
  private MainViewModel model = new MainViewModel();

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

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.setModel(model);

    model.onCreate();
  }

  @Override
  protected void onResume() {
    super.onResume();
    model.onResume();
  }

  @Override
  protected void onPause() {
    super.onPause();
    model.onPause();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    model.onDestroy();
  }
}

ActivityMainBinding 같은 건 알아서 만들어 준다.

 

 

 

결과는 이렇다.