Slides of the keynote given at the Spanish GDG summit on September 2015
Tools & tips of the tradefor the Android DeveloperSaúl MolineroSpanish GDGs Summit 2015
View Slide
Android UI
Material Design
Material design Spechttps://www.google.com/design/spec/material-design/introduction.html
Android Nicetieshttp://androidniceties.tumblr.com
materialuphttp://www.materialup.com
https://dribbble.com/
+ =https://github.com/saulmm/OpenLibra-Material
TabLayoutFloatingActionButtonCollapsingActionBarLayoutNavigationView compile ‘com.android.support:design:23.x.x’
TabLayoutFloatingActionButtonCollapsingActionBarLayoutNavigationViewhttps://github.com/chrisbanes/cheesesquare
CoordinatorLayout
android:id=“@+id/io.appbar”/> app:layout_anchor=“@id/io.appbar” app:anchor_gravity=“bottom” > Coordinator Layout: Anchor attributes
android:behavior_overlapTop=“78dp”> CoordinatorLayout: Flexible Spacehttps://github.com/saulmm/CoordinatorExamples
https://github.com/saulmm/CoordinatorBehaviorExampleCoordinator Layout: Behaviors
Child
Coordinator Layout BehaviorsDependency
public static class AvatarImageBehavior extends CoordinatorLayout.Behavior {@Overridepublic boolean layoutDependsOn( CoordinatorLayout parent, CircleImageView, child, View dependency) {return dependency instanceof Toolbar;} public boolean onDependentViewChanged( CoordinatorLayout parent, CircleImageView avatar, View dependency) { modifyAvatarDependingDependencyState(avatar, dependency);}}
Multiple Parallax Effectshttps://github.com/saulmm/CoordinatorBehaviorExample public void initParallaxValues { CollapsingToolbarLayout.LayoutParams lp1 = (CollapsingToolbarLayout.LayoutParams) mPetImage.getLayoutParams(); CollapsingToolbarLayout.LayoutParams lp2 = (CollapsingToolbarLayout.LayoutParams) mPetTextContainer.getLayoutParams(); lp1.setParallaxMultiplier(0.9f); lp2.setPArallaxMultiplier(0.3f); mPetImage.setLayoutParams(lp1); mPetTextContainer.setLayoutParams(lp2); }
Android Resources
android:layout_width=“@dimen/spacing_left” android:layout_height=“wrap_content” /> android:layout_width=“wrap_content” android:layout_height=“wrap_content” style=“@style/myTitleText” /> android:layout_width=“wrap_content” android:layout_height=“wrap_content” style=“@style/mSubTitleText />56dp
android:layout_width=“wrap_content” android:layout_height=“wrap_content” style=“@style/Widget.Appcompat.Toolbar.Button.Navigation /> android:layout_width=“wrap_content” android:layout_height=“wrap_content” style=“@style/TextAppearance.Appcompat.Widget.ActionBar.Title” /> android:layout_width=“wrap_content” android:layout_height=“wrap_content” style=“@style/TextAppearance.Appcompat.Widget.ActionBar.Subtitle” />Reuse available styles
Built-in decompiler
2dp 4dp 8dp 16dp 32dp No results You need to be logged Network error Couldn’t fetch films Couldn’t fetch %s dataOrganise your resources, DRYhttps://github.com/futurice/android-best-practices 12sp 14sp 16sp 18sp 2dp 4dp 8dp 12dp 16dp
<br/> <item name=“android:textColor”>?colorAccent</item> <br/> <item name=“android:fontFamily”>sans-‐serif-‐medium</item> <br/> <item name=“android:textAllCaps”>true</item> <br/> <br/> <item name=“android:textColor”>@color/gray_dark</item> <br/> <br/> <item name=“android:minHeight”>@dimen/grid_size_medium</item> <br/> <item name=“android:gravity”>center_vertical</item> <br/> <br/> <item name=“android:textAppearance”>@style/TextAppearance.Header</item> <br/> <br/> <item name=“android:textAppearance”>@style/TextAppearance.Field</item> <br/> <br/> <item name=“android:clickable”>true</item> <br/> <item name=“android:background”>?android:attr/selectableItemBackground</item> <br/>
Vector graphics generator
Architecture
EntitiesUse casesControllersUIClean architecture
public interface MoviewView { public void showMovieTitle (String title); public void showMovieImage (String imageUri); public void showTagLine (String tagLine); public void showDescription (String descrpition); public void showWebPage (String webPage); public void showProducer (String producer); public void showLoadingIndicator (); public void hideLoadingIndicator (); }
public class MovieActivity implements MovieView { private MoviePresenter mPresenter; public void onCreate () { … mPresenter.onCreate(); } public void onResume () { … mPresenter.onResume(); } public void showMovieTitle (String title) { mTitleTextView.setText(title); } public void showMovieImage (String imageUri) { Glide.with(this).load(imageUri).into(mFilmImageView); } public void showLoadingIndicator () { mLoadingIndicator.setVisibility(View.VISIBLE); } public void hideLoadingIndicator () { mLoadingIndicator.setVisibility(View.GONE); } }
public interface MoviePresenter { private MovieView mMoviewView; private MovieUsecase mMovieUsecase; public void MoviePresenter (MovieView movieView) { mMovieView = movieView; } public void onCreate () { mMoviewView.showLoadingMoview(); mMovieUsecase.subscribe(movie::bindMovie) } public void bindMovie (Movie movie) { mMovieView.hideLoadingIndicator(); mMovieView.showMovieTitle(movie.getTitle()); mMovieView.showMovieImage(movie.getImage()); } }
public class MovieUsecase implements Usecase { private Repository mRepository; public Observable execute { return mRepository.getRandomMovie(); } }
// settings.gradle include: ‘:presentation’, ‘:domain’, ‘:model’, ‘:common’// your module build.gradle compile project: ‘(:{your module})’ Layers as modules
Libraries & resources
ButterKnifehttp://jakewharton.github.io/butterknife/
Stethohttps://github.com/facebook/stetho
RetroLambdahttps://github.com/orfjackal/RxAndroidhttps://github.com/ReactiveX/RxAndroidRxJavahttps://github.com/ReactiveX/RxJavaBe reactive!
To-do list
https://code.facebook.com/posts/android/http://panavtec.me/https://github.com/lgvalle/Material-Animationshttp://www.technotalkative.com/part-4-playing-with-navigationview/https://medium.com/ribot-labs/exploring-the-new-android-design-support-library-b7cda56d2c32http://androcode.es/http://google.github.io/dagger/http://blog.sqisland.com/https://medium.com/ribot-labs/exploring-the-new-android-design-support-library-b7cda56d2c32https://github.com/JakeWharton
https://blog.stylingandroid.com/http://androidweekly.net/http://antonioleiva.comhttps://developers.google.com/experts/all/technology/androidhttps://github.com/trending?l=javahttp://fernandocejas.com/http://gradleplease.appspot.com/https://github.com/futurice/android-best-practiceshttps://github.com/googlesamples?utf8=%E2%9C%93&query=android
Thanks !https://github.com/saulmmhttps://twitter.com/_saulmmhttp://saulmm.github.io/