[android] MVVM – 9. inherit BaseActivity

내가 만든 앱은 어지간하면 BaseActivity를 상속해서 만든다. 모든 화면에서 공통적으로 사용되는 것들만 고르고 골라서 넣어두면 이것만큼 편한게 없다.

근데 찾아보니 데이터바인딩 + 액티비티 상속은 잘 안나온다. 물론 내가 못 찾는 거겠지만…

그래서 만들어봤는데, 생각보다 쉽게 끝났다.

 

 

먼저  BaseActivity에서 사용할 뷰모델을 만든다.

public class BaseActivityViewModel implements BaseViewModel {
  @Override
  public void onCreate() {}

  @Override
  public void onResume() {}

  @Override
  public void onPause() {}

  @Override
  public void onDestroy() {}

  public void baseButtonClick() {
    Log.i("BaseActivityViewModel : baseButtonClick", "|" + "base click");
  }
}

 

 

버튼 하나와 자식 액티비티가 표시될 레이아웃만 올린다.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

  <data>

    <variable
      name="model"
      type="kr.susemi99.testmvvm.inherit.BaseActivityViewModel"/>
  </data>

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="base"
      android:onClick="@{()->model.baseButtonClick()}"/>

    <FrameLayout
      android:id="@+id/activity_container"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>
  </LinearLayout>
</layout>

 

 

BaseActivity에는 자식이 호출할 putContentView()를 올린다.

public class BaseActivity extends AppCompatActivity {
  private ActivityBaseBinding binding;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = DataBindingUtil.setContentView(this, R.layout.activity_base);
    binding.setModel(new BaseActivityViewModel());
  }

  protected <T extends ViewDataBinding> T putContentView(@LayoutRes int resId) {
    return DataBindingUtil.inflate(getLayoutInflater(), resId, binding.activityContainer, true);
  }
}

 


 

자식 액티비티용 뷰모델도 만든다.

public class ChildActivityViewModel implements BaseViewModel {
  @Override
  public void onCreate() {}

  @Override
  public void onResume() {}

  @Override
  public void onPause() {}

  @Override
  public void onDestroy() {}

  public void childButtonClick() {
    Log.i("ChildActivityViewModel : childButtonClick", "|" + "child click");
  }
}

 

자식 화면에는 버튼 하나만 올린다.

<layout>

  <data>

    <variable
      name="model"
      type="kr.susemi99.testmvvm.inherit.ChildActivityViewModel"/>
  </data>

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

    <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="@{()->model.childButtonClick()}"
      android:text="child"/>
  </LinearLayout>
</layout>

 

 

자식 액티비티에서는 putContentView()만 호출하면 된다.

public class ChildActivity extends BaseActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityChildBinding binding = putContentView(R.layout.activity_child);
    binding.setModel(new ChildActivityViewModel());
  }
}

 

 

두 화면 모두 잘 동작한다.

I/BaseActivityViewModel : baseButtonClick: |base click
I/ChildActivityViewModel : childButtonClick: |child click