내가 만든 앱은 어지간하면 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