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 같은 건 알아서 만들어 준다.
결과는 이렇다.