├── .gitignore ├── .travis.yml ├── README.md ├── ViewModelBinding.iml ├── build.gradle ├── extras ├── AndroidStudioTemplate │ ├── screen.png │ ├── templates │ │ └── viewmodelbinding │ │ │ └── ViewModelBindingActivity │ │ │ ├── globals.xml.ftl │ │ │ ├── recipe.xml.ftl │ │ │ ├── root │ │ │ └── src │ │ │ │ └── app_package │ │ │ │ ├── AndroidManifest.xml.ftl │ │ │ │ ├── Screen.java.ftl │ │ │ │ ├── ViewModel.java.ftl │ │ │ │ ├── layout.xml.ftl │ │ │ │ └── strings.xml.ftl │ │ │ ├── template.xml │ │ │ └── template_blank_activity.png │ └── thumbnails.sketch ├── diagram.gliffy └── diagram.png ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── publish.gradle ├── sample ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cz │ │ └── kinst │ │ └── jakub │ │ └── sample │ │ └── viewmodelbinding │ │ ├── ArgumentDialogFragment.java │ │ ├── ArgumentDialogViewModel.java │ │ ├── MainActivity.java │ │ └── MainViewModel.java │ └── res │ ├── layout │ ├── activity_main.xml │ └── dialog_argument.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── settings.gradle └── viewmodelbinding ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── main ├── AndroidManifest.xml ├── java │ └── cz │ │ └── kinst │ │ └── jakub │ │ └── viewmodelbinding │ │ ├── BindingAdapters.java │ │ ├── OnViewModelInitializedCallback.java │ │ ├── PermissionsManager.java │ │ ├── ViewInterface.java │ │ ├── ViewModel.java │ │ ├── ViewModelActivity.java │ │ ├── ViewModelBindingConfig.java │ │ ├── ViewModelBindingHelper.java │ │ ├── ViewModelDialogFragment.java │ │ ├── ViewModelFragment.java │ │ ├── ViewModelProvider.java │ │ └── retrofit │ │ └── RetrofitCallViewModel.java └── res │ └── layout │ └── binding_variable_placeholder.xml └── test └── java └── cz └── kinst └── jakub └── viewmodelbinding ├── ViewModelProviderTest.java └── mock └── BasicViewModel.java /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | /.idea 9 | 10 | *.iml 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | sudo: false 3 | jdk: oraclejdk8 4 | env: 5 | matrix: 6 | - ANDROID_TARGET=android-25 ANDROID_ABI=armeabi-v7a 7 | 8 | android: 9 | components: 10 | - platform-tools 11 | - tools 12 | - build-tools-25.0.2 13 | - android-25 14 | 15 | # Additional components 16 | - extra-google-m2repository 17 | - extra-android-m2repository 18 | - extra-android-support 19 | 20 | cache: 21 | directories: 22 | - $HOME/.gradle/caches/2.9 23 | - $HOME/.gradle/caches/jars-1 24 | - $HOME/.gradle/daemon 25 | - $HOME/.gradle/native 26 | - $HOME/.gradle/wrapper 27 | 28 | 29 | script: 30 | # Unit tests 31 | - ./gradlew testReleaseUnitTest 32 | # If successful and Git TAG exists - publish to Bintray 33 | - '[[ -z $TRAVIS_TAG ]] || ./gradlew bintrayUpload -q' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android ViewModelBinding 2.0 2 | [![Build Status](https://travis-ci.org/jakubkinst/Android-ViewModelBinding.svg?branch=master)](https://travis-ci.org/jakubkinst/Android-ViewModelBinding) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-ViewModelBinding-green.svg?style=true)](https://android-arsenal.com/details/1/3240) [ ![Download](https://api.bintray.com/packages/jakubkinst/cz.kinst.jakub/android-viewmodelbinding/images/download.svg) ](https://bintray.com/jakubkinst/cz.kinst.jakub/android-viewmodelbinding/_latestVersion) 3 | ## Intro 4 | A lightweight library aiming to speed up Android app development by leveraging the new [Android Data Binding](http://developer.android.com/tools/data-binding/guide.html) and taking the best from the [Model-View-ViewModel](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel) design pattern. 5 | 6 | ### Why should I use it? 7 | 1. **Data Binding** 8 | Android Data Binding is great and if you're not, you should start using it today. 9 | 2. **You don't need to care about screen rotation (configuration change) at all.** 10 | Most of the screen lifecycle is moved to ViewModel where the lifecycle is dramatically easier to understand and to use. The **ViewModel instance outlives it's Activity/Fragment** during configuration change so no more hassle with `onSaveInstanceState()` or using retained Fragments. 11 | 3. **ViewModel as the only variable in the layout** 12 | ViewModel serves as the data provider in layout's binding as well as handler for click or other methods common fro Data Binding. With a construct like `android:onClick="@{viewModel.onClickedPlayButton}"` **you will never have to set an `OnClickListener` anymore**. Also, each ViewModel extends `BaseObservable` so you have a choice between using BaseObservable approach or ObservableField approach within the DataBinding. (see [Data Binding Guide](http://developer.android.com/tools/data-binding/guide.html)) 13 | 14 | ### How does it work? 15 | The framework extensively uses Java Generics to provide a type-safe link between Activity/Fragment and ViewModel and its binding. 16 | 17 | ViewModel instances are stored in a global static Map and reattached automatically to corresponding Activity/Fragment. When there is no need for the ViewModel anymore (Activity finished) the instance is destroyed. 18 | 19 | 20 | ### ViewModel Lifecycle 21 | ![ViewModel Lifecycle Diagram](extras/diagram.png) 22 | 23 | ## Installation 24 | 25 | ```groovy 26 | compile 'cz.kinst.jakub:viewmodelbinding:2.0.0' 27 | ``` 28 | 29 | Don't forget to **enable Data Binding** in your module: 30 | ```groovy 31 | android { 32 | dataBinding.enabled = true 33 | } 34 | ``` 35 | ## Usage 36 | 37 | ### Activity/Fragment 38 | `MainActivity.java` 39 | 40 | ```java 41 | public class MainActivity extends ViewModelActivity { 42 | 43 | @Override 44 | protected void onCreate(@Nullable Bundle savedInstanceState) { 45 | setupViewModel(R.layout.activity_main, MainViewModel.class); 46 | super.onCreate(savedInstanceState); 47 | } 48 | 49 | // handle Activity related stuff here - Options menu, Toolbar, Window config, etc. 50 | } 51 | ``` 52 | 53 | `activity_main.xml` 54 | 55 | ```xml 56 | 58 | 59 | 60 | 61 | 64 | 65 | 66 | 71 | 72 | 75 | 76 | 82 | 83 | 84 | 85 | 90 | 91 | 100 | 101 | 102 | 103 |