Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Best Practices to develop for different Android...

Best Practices to develop for different Android Device Classifications - Mobile Tech Conference 2014 spring Munich

Here you can experience the learnings, which the presenter got during development of the ImmobilienScout 24 Android application. The presentation doesn't cover Design, UX or Fragments, but it gives an introduction and samples of using different resources, in special layouts. These folders can be used for filtering specific configurations, referencing other resources and using layout aliases. This session aims at people with knowledge of coding for Android.

Hasan Hosgel

March 19, 2014
Tweet

More Decks by Hasan Hosgel

Other Decks in Technology

Transcript

  1. ImmobilienScout24 Germany’s largest real estate listing company. > 10 Mio.

    Monthly unique users > 1.5 Mio. real estates > 300 Mio. detail views > 1500 Servers ~ 7.5 Mio. App downloads > 3 Mio. Android > 50% mobile traffic
  2. Open Automotive Alliance Starting 2014 several companies plan to bring

    Android platform to the cars. •  Audi •  GM •  Google •  Honda •  Hyundai •  Nvidia http://www.openautoalliance.net/
  3. Resource Folders You can use several qualifiers in the resource

    folders name for serving the best matching resource.
  4. Qualifiers •  Language (-en) •  Language & Region (-en-rUS) • 

    Smallest Width (–sw600dp) •  Screensize (-small, -normal, -large) •  Screen Orientation (-port, -land) •  Screen Pixel Densitiy (-hdpi, -xxhdpi,…) •  Platform Version (-v11, -v13)
  5. Best Matching Resource Wins 1.  res/values/strings.xml 2.  res/values-en-rUS/strings.xml 3.  res/values-large/strings.xml

    4.  res/values-sw600dp/strings.xml The order of the qualifiers in the previous slides gives the ranking, if two resources have the same matching number of qualifiers.
  6. Image Resources •  Use the different qualifiers for the screen

    pixel density (mdpi, hdpi, etc.) •  If you are forced to use text on images use language and region (en, es-rUS, en-rUS, etc.) •  Better approach is to use 9-patch drawables, which stretches automatically depending on the content inside. •  You must provide different launcher icons for Froyo, Honeycomb and above? Use the platform version. (v4, v11, v14)
  7. Classifications for Layouts Platform version at least v13 (Honeycomb MR2)

    project-folder/res/ layout/ è small phones
  8. Classifications for Layouts Platform version at least v13 (Honeycomb MR2)

    project-folder/res/ layout/ è small phones layout-sw320dp/ è other phones
  9. Classifications for Layouts Platform version at least v13 (Honeycomb MR2)

    project-folder/res/ layout/ è small phones layout-sw320dp/ è other phones layout-sw600dp/ è tablets 7”
  10. Classifications for Layouts Platform version at least v13 (Honeycomb MR2)

    project-folder/res/ layout/ è small phones layout-sw320dp/ è other phones layout-sw600dp/ è tablets 7” layout-sw720dp/ è tablets 10” * You should also use the orientation qualifier
  11. Platform version lower v11 project-folder/res/ layout/ layout-sw320dp/ è other phones

    layout-sw600dp/ è tablets 7” layout-sw720dp/ è tablets 10”
  12. Platform version lower v11 project-folder/res/ layout/ è phones layout-sw320dp/ è

    other phones layout-sw600dp/ è tablets 7” layout-sw720dp/ è tablets 10”
  13. Platform version lower v11 project-folder/res/ layout/ è phones layout-v11/ è

    tablets 10” layout-sw320dp/ è other phones layout-sw600dp/ è tablets 7” layout-sw720dp/ è tablets 10”
  14. Platform version lower v11 project-folder/res/ layout/ è phones layout-v11/ è

    tablets 10” layout-v13/ è small phones layout-sw320dp/ è other phones layout-sw600dp/ è tablets 7” layout-sw720dp/ è tablets 10”
  15. Hint The smallest width qualifier gets automatically platform version ”-v13”

    through the packager, for avoiding problems with the number of matching qualifiers.
  16. How to Classify In Code •  Read configuration from the

    device •  Smarter approach is to use boolean resources
  17. Current Layout File Structure project-folder/res/ layout/main.xml layout-v11/main.xml layout-v13/main.xml layout-sw320dp/main.xml layout-sw600dp/main.xml

    layout-sw720dp/main.xml Fixing one bug in the 10“ layout has to be done in two files.  error prone
  18. Resource Alias Put your layout files in the default folder.

    project-folder/res/ layout/main_phone_small.xml layout/main_phone_other.xml layout/main_tablet_7.xml layout/main_tablet_10.xml
  19. Create an item with the needed classification in the previously

    defined values folder. project-folder/res/values-sw720dp/layouts.xml <resources> </resources>
  20. Create an item with the needed classification in the previously

    defined values folder. project-folder/res/values-sw720dp/layouts.xml <resources> <item name="main" > </item> </resources>
  21. Create an item with the needed classification in the previously

    defined values folder. project-folder/res/values-sw720dp/layouts.xml <resources> <item name="main" type="layout"> </item> </resources>
  22. Create an item with the needed classification in the previously

    defined values folder. project-folder/res/values-sw720dp/layouts.xml <resources> <item name="main" type="layout"> @layout/main_tablet_10.xml </item> </resources>
  23. Custom View public class CustomView extends LinearLayout { … public

    CustomView(Context context, AttributeSet attrs) { … addView(createTextView(context, "label"), lp); addView(createTextView(context, "desc"), lp); if(getResources().getBoolean(R.bool.is_phone)){ setOrientation(VERTICAL); } else { setOrientation(HORIZONTAL); } } … }
  24. Custom XML Attribute <resources> <declare-styleable name=”CustomView"> <attr name="label" format="reference|string"/> <attr

    name="value" format="reference|string"/> <attr name="orientation" format="enum"> <enum name="horizontal" value="0"/> <enum name="vertical" value="1"/> </attr> </declare-styleable> <resources>
  25. Usage In Layout Files 1.  Add to root XML node

    xmlns:app="http://schemas.android.com/apk/res- auto"
  26. Usage In Layout Files 1.  Add to root XML node

    xmlns:app="http://schemas.android.com/apk/res- auto" 2.  Usage in custom view <de.alosdev.CustomView android:id="@+id/customView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:label="label 1" app:orientation="vertical" app:value="value 1" />
  27. public class CustomView extends LinearLayout { static final int[] ORIENTATION

    = new int[] { HORIZONTAL, VERTICAL }; public CustomView(Context context, AttributeSet attrs) { super(context, attrs); … TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView); try { setOrientation(ORIENTATION[ a.getInt(R.styleable.CustomView_orientation, 0)]); } finally { a.recycle(); } } … }
  28. If custom view has much more business logic and need

    lifecycles  Create a Fragment
  29. Best Practices You have already an application  Remove orientation

    fixation and suppressing of orientation change from manifest to avoid long bug analyzing. You start from the scratch  Focus on main classification for faster time to market  But create an overall concept for better modularization
  30. If you support both orientations, save the instance state while

    orientation changes for more responsiveness Especially for states, that need a long computation for creation. Make the state object Parcelable for faster write & read and also to have a smaller memory footprint
  31. Developer Hints •  You can start an activity for result

    from a fragment, so the response can be handled in the fragment. •  If you want to register a special service on every onCreate method of an activity give the ActivityLivecycleCallbacks a try. You can register them in the onCreate method of the application. (minSDK -v14)
  32. If you get a BadParcelableException with the cause ClassNotFound-Exception, the

    source can be a NullPointerException during the read or write of the Parcelable. Exceptions are hidden during the parcel process.
  33. If you want to use “match_parent” or “wrap_content” in a

    dimension alias, you should use “-1px” or “-2px” project-folder/res/values/dimen.xml <resources> <dimen name="my_dimen>@dimen/match_parent</dimen> <dimen name="match_parent">-1px</dimen> <dimen name="wrap_content">-2px</dimen> </resources> project-folder/res/values-sw600dp/layout.xml <resources> <dimen name="my_dimen>300dp</dimen> </resources>
  34. Listener Hell If you have to many listeners or you

    think the programming model is old school like the “goto statements”. Give message/ event/ service bus a try. For Android: •  Otto from Square •  EventBus from greenrobot See also: Callbacks as our Generations' Go To Statement
  35. www.immobilienscout24.de www.immobilienscout24.de Thanks for your attention! Contact: +HasanHosgel @alosdev alosdev

    Best Practices to develop for different Android Device Classifications https://github.com/alosdev/multidevice-nightmare-demo http://www.slideshare.net/hosgel/mtc-spring-2014-best-practices-to-develop-for-different- android-device-classifications