
æè¿ã®DroidConã¢ã¹ã¯ã¯2016ã§ãããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãªã䜿çšããMVVMã«ã€ããŠã®è¬æŒãšãMVPã§ã®äœæ¥ã«åœ¹ç«ã€Moxyã©ã€ãã©ãªã«ã€ããŠã®è¬æŒããããŸããã å®éãéå»6ãæéãã©ã€ããããžã§ã¯ãã§äž¡æ¹ã®ã¢ãããŒãããã¹ãããããšãã§ããŸããã ãããŠãDatabinding Libraryããã¹ã¿ãŒããå®çšŒåç°å¢ã§ MVVMãããžã§ã¯ãããªãªãŒã¹ããŠããããã®ãã¿ãŒã³ã䜿çšããããªãçç±ãçè§£ãããŸã§ã®ç§ã®éã«ã€ããŠã話ããããšæããŸã ã
Databinding Libraryã«å€¢äžã«ãªããMVVMã§ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã決ãããã¹ãŠã®äººã«ç®èº«çã«ãããªãã¯åæ¢ãªäººã§ãïŒ
ããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãª
Databinding Libraryãçè§£ãå§ããŠãæéãåããŸããã æ¢ã«ãããããç¥ã£ãŠãã人ã¯ç§ãçè§£ããã§ãããããããŠãæ®ãã®ããã«ããã®ã©ã€ãã©ãªã§ã®ä»äºã¯æ¬¡ã®ããã«ãªããŸãïŒ

Databinding Libraryã䜿çšãããšã次ã®ããšãã§ããŸãã
幞éã¯åžžã«è€éãªãããã¯ã§ãã£ããããæåŸã®ãã€ã³ãã¯ç§ã«ãšã£ãŠç¹ã«åã°ããããšã§ãã ç»é¢ã«3ã€ã®ç¶æ
ïŒèªã¿èŸŒã¿ãããŒã¿ããšã©ãŒïŒã衚瀺ããå¿
èŠãããå Žåã¯ãåé¡ãããŸããã ãã ããããŒã¿ã«å¿ããŠèŠçŽ ã®ç¶æ
ã«ããŸããŸãªèŠä»¶ãããå ŽåïŒããšãã°ãããã¹ãã空ã§ãªãå Žåã«ã®ã¿ããã¹ãã衚瀺ããããå€ã«å¿ããŠè²ã倿Žãããããå ŽåïŒãã€ã³ã¿ãŒãã§ã€ã¹ç¶æ
ã®ãã¹ãŠã®å¯èœãªãªãã·ã§ã³ãåãã倧ããªã¹ã€ãã ããŸãã¯å€ãã®ãã©ã°ãšã³ãŒããå¿
èŠã«ãªãå ŽåããããŸãèŠçŽ ã«å€ãèšå®ããæ¹æ³ã§ã
ãããã£ãŠãDatabinding Libraryã«ããç¶æ
ã®æäœã容æã«ãªããšããäºå®ã¯å€§ããªãã©ã¹ã§ãã ããšãã°ã xml android:visibility=â@{user.name != null ? View.VISIBLE : View.GONE}â
android:visibility=â@{user.name != null ? View.VISIBLE : View.GONE}â
ããŠãŒã¶ãŒåã§TextViewãé衚瀺ãŸãã¯è¡šç€ºããã¿ã€ãã³ã°ãèããããšã¯ã§ããªããªããŸããã ååãä»ããã ãã§ã衚瀺ã¯èªåçã«å€æŽãããŸãã
ViewModel
ãããã ããŒã¿ãã€ã³ãã£ã³ã°ãããç©æ¥µçã«äœ¿çšãå§ãããšã xmlã§ããå€ãã®ã³ãŒããååŸã§ããŸãã ãããŠã ã¬ã€ã¢ãŠãããã³ãã«å€ããªãããã«ããã®ã³ãŒããåãåºãã¯ã©ã¹ãäœæããŸãã ãŸãã xmlã§ã¯ããããã£åŒã³åºãã®ã¿ãæ®ããŸãã äŸãæããŸãããã Userã¯ã©ã¹ããããšããŸãïŒ
public class User { public firstname; public lastname; }
ãããŠãUIã§ãã«ããŒã ã確èªãã xmlã§èšè¿°ããŸãã
<TextView android:text="@{user.firstname + user.lastname}" />
ç§ã¯ãããxmlã§å®éã«èŠãããªãã®ã§ããã®ããžãã¯ã転éããã¯ã©ã¹ãäœæããŸãã
public class UserViewModel extends BaseObservable { private String name; @Bindable public String getFullname() { return name; } public void setUser(User user) { name = user.firstname + user.lastname; notifyPropertyChanged(BR.name); } }
ã©ã€ãã©ãªã®äœæè
ã¯ããã®ãããªã¯ã©ã¹ãViewModelãšåŒã¶ããšããå§ãããŸãïŒé©ãã»ã©ãMVVMãã¿ãŒã³ã®ããã«ïŒã
äŸã§ã¯ãã¯ã©ã¹ã¯BaseObservableãç¶æ¿ããã³ãŒãã§ã¯notifyPropertyChangedïŒïŒãåŒã³åºããŸããããããå¯äžã®æ¹æ³ã§ã¯ãããŸããã ObservableFieldã§ãã£ãŒã«ããã©ããããããšãã§ããäŸåUIèŠçŽ ã¯èªåçã«æŽæ°ãããŸãã ãããããã®æ¹æ³ã®æè»æ§ã¯äœããã»ãšãã©äœ¿çšããŠããŸããã
ããã§ã xmlã«æ¬¡ã®ããã«ãªããŸãã
<TextView android:text="@{viewmodel.name}" />
ã¯ããã«è¯ãã§ããã
ãã®ãããããŒã¿ãšãã¥ãŒã®éã®ã¬ã€ã€ãŒãšããŠæ©èœããViewModelã¯ã©ã¹ããããŸã ã ããŒã¿å€æãåŠçããã©ã®ãã£ãŒã«ãïŒããã³é¢é£ããUIèŠçŽ ïŒãå¶åŸ¡ããæŽæ°ããããšãäžéšã®ãã£ãŒã«ããä»ã®ãã£ãŒã«ãã«äŸåããæ¹æ³ã®ããžãã¯ãå«ãŸããŸãã ããã«ãããã³ãŒãããxmlãã¯ãªã¢ã§ããŸãã ããã«ããã®ã¯ã©ã¹ã䜿çšããŠã ãã¥ãŒããã®ã€ãã³ãïŒã¯ãªãã¯ãªã©ïŒãåŠçãããšäŸ¿å©ã§ãã
ãããŠãããã§èããæµ®ãã³ãŸã ïŒ æ¢ã«databindingãããå Žåã衚瀺ããžãã¯ãå«ãViewModelã¯ã©ã¹ããããŸããããã§ã¯ããªãMVVMãã¿ãŒã³ã䜿çšããªãã®ã§ããããïŒ
ãã®èãã¯å¿
ç¶çã«çããŸãã çŸæç¹ã§ç§ãã¡ãæã£ãŠãããã®ã¯ãMVVMãã¿ãŒã³ãšéåžžã«è¿ãããã§ãã ãããç°¡åã«èŠãŠã¿ãŸãããã
MVVM
Model-View-ViewModelãã¿ãŒã³ã«ã¯ã3ã€ã®äž»èŠãªã³ã³ããŒãã³ãããããŸãã
- ã¢ã㫠衚瀺ããããŒã¿ãæäŸããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ã
- 衚瀺ãã ãŠãŒã¶ãŒãç»é¢ã«è¡šç€ºãããã¹ãŠã®UIèŠçŽ ã®å€èгãå Žæãããã³æ§é ãæ
åœããŸãã
- ViewModel ãã¥ãŒãšã¢ãã«ã®éã®ããªããžãšããŠæ©èœãã衚瀺ããžãã¯ãåŠçããŸãã Modelã«ããŒã¿ãèŠæ±ããViewãç°¡åã«äœ¿çšã§ãããã¥ãŒã§ãããViewã«æž¡ããŸãã ãŸãããã¿ã³ãã¯ãªãã¯ãããªã©ããã¥ãŒã§ã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒã«ãã£ãŠã³ããããããã€ãã³ãã®åŠçãå«ãŸããŸãã ããã«ãViewModelã¯ãããšãã°ããŒããé²è¡äžãã©ãããªã©ã衚瀺ããå¿
èŠããã远å ã®Viewã¹ããŒããå®çŸ©ãã圹å²ãæãããŸãã
åçã§èŠããããã®ã³ã³ããŒãã³ãéã®é¢ä¿ãšçžäºäœçšïŒ

ç¢å°ã¯äŸåé¢ä¿ã瀺ããŸããViewã¯ViewModelãèªèããViewModelã¯ModelãèªèããŸãããã¢ãã«ã¯ViewModelãèªèãããViewModelã¯ViewãèªèããŸããã
ããã»ã¹ã¯æ¬¡ã®ãšããã§ããViewModelã¯ããŒã¿ãã¢ãã«ã«èŠæ±ããå¿
èŠã«å¿ããŠæŽæ°ããŸãã ã¢ãã«ã¯ãããŒã¿ãããããšãViewModelã«éç¥ããŸãã ViewModelã¯ããŒã¿ãååŸããŠå€æããUIã®ããŒã¿ã®æºåãã§ããããšãViewã«éç¥ããŸãã ViewModelãšViewã®é¢ä¿ã¯ãããŒã¿ãšè¡šç€ºãèªåçã«ãªã³ã¯ããããšã«ãã£ãŠè¡ãããŸãã ç§ãã¡ã®å Žåãããã¯ããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãªã䜿çšããããšã§éæãããŸãã ããŒã¿ãã€ã³ãã£ã³ã°ã§ã¯ ãViewModelã®ããŒã¿ã䜿çšããŠãã¥ãŒãæŽæ°ãããŸãã
èªåããŒã¿ãã€ã³ãã£ã³ã°ã®ååšã¯ããã®ãã¿ãŒã³ãšPresentationModelããã³MVPãã¿ãŒã³ãšã®äž»ãªéãã§ãïŒMVPã§ã¯ãPresenterã¯æäŸãããã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¡ãœãããåŒã³åºãããšã§ãã¥ãŒã倿ŽããŸãïŒã
Android MVVM
ããã§ããããžã§ã¯ãã§MVVMã䜿ãå§ããŸããã ããããããã°ã©ãã³ã°ã§ã¯ããããããšã§ãããçè«ãšå®è·µã¯åããã®ã§ã¯ãããŸããã ãããŠããããžã§ã¯ãã®å®äºåŸãç§ã¯ãŸã äžæºãæããŠããŸããã ãã®ã¢ãããŒãã«ã¯äœãåé¡ããããäœãã奜ãã§ã¯ãããŸããã§ãããããããäœã§ãããçè§£ã§ããŸããã§ãã ã
次ã«ãAndroidã§MVVMå³ãæãããšã«ããŸããã

çµæãèæ
®ããŠãã ããïŒ
ViewModelã«ã¯ã XMLã§ããŒã¿ãã€ã³ãã£ã³ã°ã«äœ¿çšããããã£ãŒã«ãïŒ android:text=â@{viewmodel.username}â
ïŒãå«ãŸããViewã«ãã£ãŠããªã¬ãŒãããã€ãã³ããåŠçããŸãïŒ android:onClick=â@{viewmodel::buttonClicked}â
ïŒã 圌女ã¯ã¢ãã«ã«ããŒã¿ãèŠæ±ãããããã倿ãã ããŒã¿ãã€ã³ãã£ã³ã°ã®å©ããåããŠããã®ããŒã¿ã衚瀺ããŸãã
ãã©ã°ã¡ã³ãã¯ã2ã€ã®åœ¹å²ãåæã«å®è¡ããŸããåæåãšã·ã¹ãã ãšã®éä¿¡ãæäŸããå
¥åãã€ã³ããšãViewã§ãã
ãã©ã°ã¡ã³ãïŒãŸãã¯ã¢ã¯ãã£ããã£ïŒãMVPããã³MVVMã®ãã¿ãŒã³ãçè§£ããäžã§ãã¥ãŒãšèŠãªããããšããäºå®ã¯ããã§ã«äžè¬çãªæ
£è¡ã«ãªã£ãŠãããããããã«ã€ããŠã¯è§ŠããŸããã
ã¢ã¯ãã£ããã£ã®ããããšåäœæãä¹ãåãããã«ãViewãåäœæãããŠããéã¯ViewModelããã®ãŸãŸã«ããŠãããŸãïŒãã®å Žåã¯FragmentïŒã ããã¯ã çå£ ã¹ã³ãŒããšã«ã¹ã¿ã ã¹ã³ãŒãã䜿çšããŠå®çŸãããŸãã 詳现ã«ã€ããŠã¯è§ŠããŸãããã çå£ã«é¢ããå€ãã®è¯ãèšäºããã§ã«æžãããŠããŸãã ããªãèªèº«ã®èšèã§ã¯ã次ã®ããšãèµ·ãããŸãïŒ
- ViewModelã¯çå£ã䜿çšããŠäœæããïŒãã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã®äžã«ååšããŸãïŒããã©ã°ã¡ã³ãã¯å¿
èŠã«å¿ããŠããã䜿çšããŸãã
- ãã©ã°ã¡ã³ããå転æã«åæ¢ãããšãViewModelã§detachViewïŒïŒãåŒã³åºããŸãã
- ViewModelã¯åŒãç¶ãåäœãããã®ããã¯ã°ã©ãŠã³ãããã»ã¹ãéåžžã«äŸ¿å©ã§ãã
- 次ã«ããã©ã°ã¡ã³ããåäœæããããšã attachViewïŒïŒãåŒã³åºããããèªäœããã¥ãŒãšããŠæž¡ããŸãïŒã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšïŒã
- ãã©ã°ã¡ã³ããã¿ãŒã³ã®ããã§ã¯ãªãå®å
šã«æ»ãã å Žåã ã¹ã³ãŒãã匷å¶çµäºãïŒç®çã®çå£ã³ã³ããŒãã³ãããŒãã«ãªããViewModelããã®ã³ã³ããŒãã³ããšãšãã«ã¬ããŒãžã³ã¬ã¯ã¿ã«ãã£ãŠã¢ã»ã³ãã«ãããŸãïŒãViewModelãæ»ã«ãŸãã ããã¯BaseFragmentã«å®è£
ãããŠããŸã ã
ãã©ã°ã¡ã³ããMvvmViewã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠViewModelã«æž¡ãããã®ã¯ãªãã§ããïŒ ããã¯ããã¥ãŒã§ã³ãã³ãããæåã§ãåŒã³åºãããã«å¿
èŠã§ãã ããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãªã§ãã¹ãŠãå®è¡ã§ããããã§ã¯ãããŸããã
ã·ã¹ãã ãã¢ããªã±ãŒã·ã§ã³ã匷å¶çµäºããå Žåã«ç¶æ
ãä¿åããå¿
èŠãããå Žåã savedInstanceStateãã©ã°ã¡ã³ãã䜿çšããŠViewModelç¶æ
ãä¿åããã³åŸ©å
ã§ããŸãã
ãããåäœããæ¹æ³ã§ãã
æ°é
ãã®ããèªè
ã¯ããFragmentãã³ã³ãããšããŠäœ¿çšãããã®äžã§setRetainInstance(true)
ãåŒã³åºãããšãã§ããã®ã«ããªããã¬ãŒã«ã¹ã¿ã ã¹ã³ãŒãã« setRetainInstance(true)
ããã®ã§ããïŒããšå°ããŸããã¯ããã§ããŸãã ããããå³ãæãéã«ã¯ããã¥ãŒãšããŠActivityãŸãã¯ViewGroupã䜿çšã§ããããšãèæ
®ããŸããã
æè¿ãç§ãæããæ§é ãå®å
šã«åæ ããMVVMå®è£
ã®è¯ãäŸãèŠã€ããŸããã ããã€ãã®ãã¥ã¢ã³ã¹ãé€ããŠããã¹ãŠãéåžžã«ããŸãè¡ãããŸããã èå³ãããã°èŠãŠãã ããã
å察åé¡
å³ãæããŠãã¹ãŠãçèããçµæããã®ã¢ãããŒãã§äœæ¥ããŠããéãç§ã«ã¯ãŸã£ããåããªãããšãããããŸããã ããäžåºŠå³ãèŠãŠãã ããã 倪ãç¢å°ã ããŒã¿ãã€ã³ãã£ã³ã° ããšã 衚瀺ããæåã³ãã³ã ããåç
§ããŠãã ããã ããã«ããã ããã§ãããã«è©³ãã説æããŸãã
databindingããããããã»ãšãã©ã®ããŒã¿ã¯xmlã䜿çšããŠViewã«ã€ã³ã¹ããŒã«ã§ããŸãïŒå¿
èŠã«å¿ããŠãå¿
èŠãªBindingAdapterãäœæããŸãïŒã ãããããã®ã¢ãããŒãã«é©åããªãå ŽåããããŸã ã ãããã«ã¯ããã€ã¢ãã°ã ããŒã¹ã ãã¢ãã¡ãŒã·ã§ã³ãé
å»¶ã¢ã¯ã·ã§ã³ãããã³ãã¥ãŒèŠçŽ ãå«ããã®ä»ã®è€éãªã¢ã¯ã·ã§ã³ãå«ãŸããŸãã
TextViewã§äŸãæãåºããŠãã ããã
<TextView android:text="@{viewmodel.name}" />
view.post(new Runnable())
ã䜿çšããŠãã®ããã¹ããèšå®ããå¿
èŠãããå Žåã¯ã©ããªããŸããïŒ ïŒç§ãã¡ã¯ããªãã ãšã¯æããªããã©ãæããïŒ
ãbyPostã屿§ãäœæããBindingAdapterãäœæããèŠçŽ äžã®ãªã¹ãããã屿§ã®ååšãèæ
®ã«å
¥ããããšãã§ããŸãã
@BindingAdapter(value = {"text", "byPost"}, requireAll = true) public static void setTextByPost(TextView textView, String text, boolean byPost) { if (byPost) { textView.post(new Runnable { public void run () { textView.setText(text); } }) } else { textView.setText(text); } }
ãããŠãTextViewã®äž¡æ¹ã®å±æ§ãæå®ããããã³ã«ããã®BindingAdapterã䜿çšãããŸãã 屿§ãxmlã«è¿œå ããŸãã
<TextView android:text="@{viewmodel.name}" bind:byPost="@{viewmodel.usePost}" />
ViewModelã«ã¯ãå€ãèšå®ãããšãã«view.post()
ã䜿çšããå¿
èŠãããããšã瀺ãããããã£ããããŸãã 远å ããŠãã ããïŒ
public class UserViewModel extends BaseObservable { private String name; private boolean usePost = true;
éåžžã«åçŽãªã¢ã¯ã·ã§ã³ãå®è£
ããããã«å¿
èŠãªéã確èªããŠãã ããã
ãããã£ãŠããã®ãããªããšãViewã§è¡ãæ¹ãã¯ããã«ç°¡åã§ãã ã€ãŸãããã©ã°ã¡ã³ãã«ãã£ãŠå®è£
ãããŠããMvvmViewã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããViewã¡ãœãããåŒã³åºããŸãïŒéåžžã¯MVPã§è¡ãããŠããã®ãšåãæ¹æ³ã§ïŒã
ããã§ã å察æ§ã®åé¡ãçŸããŸãã2ã€ã®ç°ãªãæ¹æ³ã§ViewãæäœããŸã ã 1ã€ã¯ïŒããŒã¿ã®ç¶æ
ãä»ããŠïŒèªåã§ã2ã€ç®ã¯ïŒè¡šç€ºäžã®ã³ãã³ãã®åŒã³åºããä»ããŠïŒæåã§ãã å人çã«ã¯å¥œãã§ã¯ãããŸããã
ç¶æ
ã®åé¡
次ã«ãå¥ã®åé¡ã«ã€ããŠèª¬æããŸãã é»è©±ã®å転ã®ç¶æ³ãæ³åããŠãã ããã
- ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸããã ViewModelãšViewïŒãã©ã°ã¡ã³ãïŒã¯çããŠããŸãã
- 圌ãã¯é»è©±ãåããŸãã-ãã©ã°ã¡ã³ãã¯æ»ã«ãViewModelã¯çãç¶ããŸããã 圌女ã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã¯ãã¹ãŠåŒãç¶ãæ©èœããŸãã
- æ°ãããã©ã°ã¡ã³ããäœæãããçµåãããŸããã ViewModelããåä¿¡ããä¿åç¶æ
ïŒãã£ãŒã«ãïŒãããŒã¿ãã€ã³ãã£ã³ã°ã§è¡šç€ºããŸã ã ãã¹ãŠãã¯ãŒã«ã§ãã
- ãããããã©ã°ã¡ã³ãïŒViewïŒãåæããããšãã«ãããã¯ã°ã©ãŠã³ãããã»ã¹ããšã©ãŒã§çµäºãã ããŒã¹ãã衚瀺ãããå Žåã¯ã©ãã§ããããã ãã©ã°ã¡ã³ãïŒViewã®åœ¹å²ãæãããŠããïŒã¯æ»ãã§ããããã®ã¡ãœãããåŒã³åºãããšã¯ã§ããŸããã
- ãã®çµæã¯å€±ãããŸãã
ViewModelãã£ãŒã«ãã®ã»ããã§è¡šãããViewç¶æ
ã ãã§ãªããViewModelãViewã§åŒã³åºãã¡ãœãããäœããã®æ¹æ³ã§ä¿åããå¿
èŠãããããšãããããŸã ã
ãã®åé¡ã¯ãåã
ã®ãã®ãããªå Žåã«ViewModelã«ãã©ã°ãã£ãŒã«ããæ¿å
¥ããããšã§è§£æ±ºã§ããŸãã ããŸãçŸãããªããæ®éçã§ããããŸããã ããããããã¯æ©èœããŸãã
ç¶æ
ã«ã€ããŠ
ç¶æ
ã®åé¡ã«ããããªããžã§ã¯ãã®ç¶æ
㯠ã ç¶æ
ãç¹åŸŽä»ããäžé£ã®ãã©ã¡ãŒã¿ãŒããŸãã¯ãªããžã§ã¯ããç®çã®ç¶æ
ã«ããããã«å®è¡ããå¿
èŠã®ããäžé£ã®ã¢ã¯ã·ã§ã³ã®2ã€ã®æ¹æ³ã§åäœæã§ãããšèããããã«ãªããŸãã ã
ã«ãŒããã¯ãã¥ãŒããæ³åããŠãã ããã 圌ã®ç¶æ
ã¯ãé¡ã®1ã€ã«9è²ã§èšè¿°ã§ããŸãã ãããŠãããªãã¯åœŒãåæç¶æ
ããæãŸããç¶æ
ã«å°ãäžé£ã®åããããããšãã§ããŸãã

1ã¿ãŒã³ã ããããå Žåãããã°ã9ã¿ãŒã³ä»¥äžãããå ŽåããããŸãã ç¶æ³ã«å¿ããŠãç¶æ
ã説æããäœããã®æ¹æ³ã®æ¹ãè¯ããæªãããããããŸãïŒå¿
èŠãªããŒã¿ã¯å°ãªãïŒã
ã¢ã¯ã·ãŒ
ç¶æ
ãåçŸããæ¹æ³ãèãããšããMoxyã©ã€ãã©ãªãŒãæãåºããããããŸããã§ããã ç§ã®ååã¯ãMVPãã¿ãŒã³ãšãã®ã©ã€ãã©ãªã䜿çšããŠãããžã§ã¯ãã䞊è¡ããŠè¡ããŸããã 詳现ã«ã€ããŠã¯èª¬æããŸããããèè
ããã®åªããèšäºã¯æ¢ã«ãããŸãã
ç§ã®æšè«ã®æèã§ã¯ã Moxyã®æ©èœã® 1ã€ã¯è峿·±ããã®ã§ãã ãã®ãã¥ãŒã§åŒã³åºãããäžé£ã®ã³ãã³ããšããŠãã¥ãŒã®ç¶æ
ãä¿åããŸã ã ãããŠãç§ãããã«ã€ããŠæåã«åŠãã ãšããããã¯ç§ã«ã¯å¥åŠã«æããŸããã
ããããä»ããã¹ãŠã®èãïŒäžèšã§ããªããšå
±æããïŒã®åŸãããã¯éåžžã«è¯ã解決çã ãšæããŸãã
ãªããªãïŒ
- ããŒã¿ïŒãã£ãŒã«ãïŒã®ã¿ã§ç¶æ
ã衚ãããšãåžžã«å¯èœïŒäŸ¿å©ïŒã§ãããšã¯éããŸããã
- MVPã§ã¯ãViewãšã®éä¿¡ã¯ã³ãã³ãåŒã³åºããä»ããŠè¡ãããŸãã 䜿ã£ãŠã¿ãŸãããïŒ
- å®éã«ã¯ããã®ç¶æ
ãåäœæããããã«å¿
èŠãªãã¥ãŒãã£ãŒã«ãã®æ°ã¯ãåŒã³åºãããã³ãã³ãã®æ°ãããã¯ããã«å€ããªãå¯èœæ§ããããŸãã
ããã«ããã®ã¢ãããŒãã¯å¥ã®ãã©ã¹ãæäŸããŸãã Databinding Libraryãšåæ§ã«ãããŸããŸãªç¶æ
ã®åé¡ãç¬èªã®æ¹æ³ã§è§£æ±ºããŸãã ãŸããäžé£ã®ã¡ãœããåŒã³åºãã«ãã£ãŠå€æŽãåäœæãããããããã£ãŒã«ãã»ãããŸãã¯ç¶æ
ã®1ã€ã®ååã«å¿ããŠUIã倿Žãã倧ããªã¹ã€ãããèšè¿°ããå¿
èŠããããŸããã
ããã§ããMoxyã«ã€ããŠã¯äœãèšããŸããã ç§ã®æèŠãšååã®æèŠã§ã¯ã仿¥ãMVPãã¿ãŒã³ãæ±ãã®ã«åœ¹ç«ã€æé«ã®ã©ã€ãã©ãªã§ãã ã³ãŒãçæã䜿çšããŠãéçºè
ã®åŽåãæå°éã«æããŸãã ãã¿ãŒã³ã®å®è£
ã«ã€ããŠèããããšã¯ã§ããŸãããããããžã§ã¯ãã®æ©èœã«ã€ããŠèããããšã¯ã§ããŸããã ããã¯ããã§ãã
ããããMVPã«ã€ããŠã¯ååã§ãã ããã§ããç§ãã¡ã¯MVVMã«ã€ããŠè©±ããŠããã®ã§ãåšåº«ã確èªããæãæ¥ãŸããã
çµè«
ç§ã¯MVVMããã¿ãŒã³ãšããŠæ°ã«å
¥ã£ãŠããããã®å©ç¹ã«ç°è°ãå±ããŸããã ãããã倧éšåã¯ä»ã®ãã¿ãŒã³ãšåãããéçºè
ã®å¥œã¿ã®åé¡ã§ãã ãããŠãäž»ãªãã©ã¹ã¯ããã¿ãŒã³ãã®ãã®ã§ã¯ãªãããŸã ããŒã¿ãã€ã³ãã£ã³ã°ã§ãã
MVVMãžã®å
±æã«é§ãããŠããããžã§ã¯ããå®è£
ããŸããã ç§ã¯é·ãéãããã¯ãç ç©¶ããçèããè°è«ãããã®ãã¿ãŒã³ã®ãã€ãã¹ã®ã»ãããèªåã§äœããŸããïŒ
- MVVMã¯ã ããŒã¿ãã€ã³ãã£ã³ã°ãšViewã¡ãœããã®2ã€ã®æ¹æ³ã§Viewãåæã«äœ¿çšãããã匷å¶ããŸãã
- MVVMã§ã¯ãç¶æ
ã®åé¡ïŒViewãViewModelããåæããããšãã«åŒã³åºãããViewã¡ãœãããžã®åŒã³åºããä¿åããå¿
èŠæ§ïŒãçŸãã解決ããããšã¯ã§ããŸããã
- ããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãªã®é«åºŠãªäœ¿çšãå¿
èŠã§ããããã¹ã¿ãŒããã«ã¯æéãããããŸãã
- 誰ããxmlã³ãŒãã奜ãããã§ã¯ãããŸããã
ã¯ãããããã®ãã€ãã¹ã«æ
£ããããšãã§ããŸãã ããããããèããçµæãã¢ãããŒãã®æçåãåŒãèµ·ãããã¿ãŒã³ã䜿çšããããªããšããçµè«ã«éããŸããã ãããŠãMVPãšMoxyã䜿çšããŠæ¬¡ã®ãããžã§ã¯ããæžãããšã«ããŸããã
ãã®ãã¿ãŒã³ã䜿çšããŠãã ãã-èªåã§æ±ºããŠãã ããã ããããç§ã¯ããªãã«èŠåããŸããã
PSïŒããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãª
ãããããç§ãã¡ãå§ãããã®ã§ããDatabinding Libraryã§çµããããŸãããã ç§ã¯ãŸã 圌女ã奜ãã§ãã ããããç§ã¯éãããéã§ããã䜿çšããã€ããã§ãïŒ
findViewById
ããã³setOnClickListener
ãèšè¿°ããªãããã- ãŸããBindingAdapter-sã䜿çšããŠäŸ¿å©ãªxml-屿§ãäœæããã«ã¯ïŒããšãã°ã
bind:font=âRoboto.ttfâ
ïŒã
ããã ãã§ãã ããã¯å©ç¹ããããããŸãããMVVMã®æ¹åã«ã¯åŒãä»ããŸããã
ããŒã¿ãã€ã³ãã£ã³ã°ã©ã€ãã©ãªã䜿çšããäºå®ãããå Žåã¯ã次ã®åœ¹ç«ã€æ
å ±ãåç
§ããŠãã ããã
- 倿°ããã€ã³ãã£ã³ã°ã«èšå®ããåŸã
onViewCreated()
binding.executePendingBindings()
ãåŒã³åºãbinding.executePendingBindings()
ã ããã¯ãã³ãŒãããæ°ããäœæããããã¥ãŒã§äœãã倿Žããå Žåã«åœ¹ç«ã¡ãŸãã ãã®ãã¥ãŒããŸã æºåã§ããŠããªãããšãç¥ã£ãåŸã view.post()
ãæžãview.post()
ã¯ãããŸããã - <fragment>ã¿ã°ã«å€æ°ãæž¡ãããšã¯ã§ããŸããïŒ <include>ã§å¯èœãªå ŽåïŒïŒ https : //code.google.com/p/android/issues/detail?id=175338 ã
- æ©èœãåããDatabinding Libraryã®xmlã®ã©ã ãã è§ãã£ãïŒ
() -> method()
ïŒãªãã§ã¯èšè¿°ã§ããŸããã ã³ãŒãããããã¯ã§ããŸããã ãã ããã¡ãœããã§äœ¿çšãããªãå Žåã¯ãã©ã¡ãŒã¿ãŒãçç¥ã§ããŸãïŒ android:onClick=â@{() -> handler.buttonClicked()}â
ïŒã - äºéåŒçšç¬ŠïŒâïŒã®ä»£ããã«ããã¯ãã£ãã¯ïŒ `ïŒã䜿çšã§ããŸãã
- BindingAdaptersã§ã¯ã屿§ïŒ
@BindingAdapter(âattributeNameâ)
ïŒã®ã¿ãæžã蟌ã¿ãŸããã åå空éã¯åŒãç¶ãç¡èŠãããŸãã ãŸãã xmlã§ã¯ ã åå空éãäœã§ãããã¯é¢ä¿ãããŸããã ãããããã°ãã°bindã䜿çšããŠåºå¥ããŸãïŒ bind:attributeName=â...â
ïŒã - ããã§çæãããããŒã¿ãã€ã³ãã£ã³ã°ã¯ã©ã¹ãæ€çŽ¢ããŸãïŒapp / build / Intermediates / classes / debug
- æ¢è£œã®ã¢ããã¿ãŒã¯ãã¡ãã§ã芧ããã ããŸã ã
- ããã¥ã¡ã³ã以å€ã®èªã¿ç©ïŒ
https://realm.io/news/data-binding-android-boyar-mount/
https://www.bignerdranch.com/blog/descent-into-databinding/
https://halfthought.wordpress.com/2016/03/23/2-way-data-binding-on-android/