112
Material Design Backwards Compatibility

Android Lollipop - Webinar am 11.12.2014

Embed Size (px)

Citation preview

Page 1: Android Lollipop - Webinar am 11.12.2014

Material Design

Backwards Compatibility

Page 2: Android Lollipop - Webinar am 11.12.2014

2

• Mobile Development • Android • iOS

• REST-Api Design • Cloud Infrastructure

About Me

+Angelo Rüggeberg

@s3xy4ngyc

http://s3xy4ngyc.github.io

Page 3: Android Lollipop - Webinar am 11.12.2014

Sample app• Source Available at

Github: https://github.com/s3xy4ngyc/Android-L-Samples

• Available at Google Play: https://play.google.com/store/apps/details?id=s3xy.de.lsamples

3

Page 4: Android Lollipop - Webinar am 11.12.2014

4

Page 5: Android Lollipop - Webinar am 11.12.2014

Distribution

5

Page 6: Android Lollipop - Webinar am 11.12.2014

Distribution

6

Page 7: Android Lollipop - Webinar am 11.12.2014

Distribution

• Devices having Android 5.0 officially:

• Nexus 5• Nexus 7• Nexus 9• LG G3

6

Page 8: Android Lollipop - Webinar am 11.12.2014

Distribution

7

Page 9: Android Lollipop - Webinar am 11.12.2014

Distribution

7

Page 10: Android Lollipop - Webinar am 11.12.2014

Dependencies

8

Page 11: Android Lollipop - Webinar am 11.12.2014

9

Page 12: Android Lollipop - Webinar am 11.12.2014

9

dependencies {

compile 'com.android.support:support-v4:21.0.2'

compile 'com.android.support:appcompat-v7:21.0.2' compile 'com.android.support:cardview-v7:21.0.2' compile 'com.android.support:recyclerview-v7:21.0.2' compile 'com.android.support:gridlayout-v7:21.0.2' compile 'com.android.support:mediarouter-v7:21.0.2' compile 'com.android.support:palette-v7:21.0.2'

compile 'com.android.support:support-v13:21.0.2'

compile 'com.android.support:leanback-v17:21.0.2'

compile 'com.android.support:support-annotations:21.0.2'

}

Page 13: Android Lollipop - Webinar am 11.12.2014

9

dependencies {

compile 'com.android.support:support-v4:21.0.2'

compile 'com.android.support:appcompat-v7:21.0.2' compile 'com.android.support:cardview-v7:21.0.2' compile 'com.android.support:recyclerview-v7:21.0.2' compile 'com.android.support:gridlayout-v7:21.0.2' compile 'com.android.support:mediarouter-v7:21.0.2' compile 'com.android.support:palette-v7:21.0.2'

compile 'com.android.support:support-v13:21.0.2'

compile 'com.android.support:leanback-v17:21.0.2'

compile 'com.android.support:support-annotations:21.0.2'

}

dependencies {

compile 'com.android.support:support-v4:21.0.2'

compile ‚com.android.support:appcompat-v7:21.0.2' //material Theme, ActionBar, etc. compile 'com.android.support:cardview-v7:21.0.2' compile 'com.android.support:recyclerview-v7:21.0.2' compile 'com.android.support:gridlayout-v7:21.0.2' compile 'com.android.support:mediarouter-v7:21.0.2' compile 'com.android.support:palette-v7:21.0.2'

compile 'com.android.support:support-v13:21.0.2'

compile 'com.android.support:leanback-v17:21.0.2'

compile 'com.android.support:support-annotations:21.0.2'

}

Page 14: Android Lollipop - Webinar am 11.12.2014

9

dependencies {

compile 'com.android.support:support-v4:21.0.2'

compile 'com.android.support:appcompat-v7:21.0.2' compile 'com.android.support:cardview-v7:21.0.2' compile 'com.android.support:recyclerview-v7:21.0.2' compile 'com.android.support:gridlayout-v7:21.0.2' compile 'com.android.support:mediarouter-v7:21.0.2' compile 'com.android.support:palette-v7:21.0.2'

compile 'com.android.support:support-v13:21.0.2'

compile 'com.android.support:leanback-v17:21.0.2'

compile 'com.android.support:support-annotations:21.0.2'

}

dependencies {

compile 'com.android.support:support-v4:21.0.2'

compile ‚com.android.support:appcompat-v7:21.0.2' //material Theme, ActionBar, etc. compile 'com.android.support:cardview-v7:21.0.2' compile 'com.android.support:recyclerview-v7:21.0.2' compile 'com.android.support:gridlayout-v7:21.0.2' compile 'com.android.support:mediarouter-v7:21.0.2' compile 'com.android.support:palette-v7:21.0.2'

compile 'com.android.support:support-v13:21.0.2'

compile 'com.android.support:leanback-v17:21.0.2'

compile 'com.android.support:support-annotations:21.0.2'

}

dependencies {

compile 'com.android.support:support-v4:21.0.2'

compile 'com.android.support:appcompat-v7:21.0.2' compile ‚com.android.support:cardview-v7:21.0.2' //New Components for Pre 5.0 compile 'com.android.support:recyclerview-v7:21.0.2' compile 'com.android.support:gridlayout-v7:21.0.2' compile 'com.android.support:mediarouter-v7:21.0.2' compile 'com.android.support:palette-v7:21.0.2'

compile 'com.android.support:support-v13:21.0.2'

compile 'com.android.support:leanback-v17:21.0.2'

compile 'com.android.support:support-annotations:21.0.2'

}

Page 15: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

10

Page 16: Android Lollipop - Webinar am 11.12.2014

11

Page 17: Android Lollipop - Webinar am 11.12.2014

11

android: Theme.Material

Page 18: Android Lollipop - Webinar am 11.12.2014

11

android: Theme.Material

android: Theme.Material.Light

Page 19: Android Lollipop - Webinar am 11.12.2014

11

Theme.AppCompat.LightTheme.AppCompat

android: Theme.Material

android: Theme.Material.Light

Page 20: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

12

Page 21: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

• Custom Style Extending Appcompat Style

12

Page 22: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

• Custom Style Extending Appcompat Style• Things to note:

12

Page 23: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

• Custom Style Extending Appcompat Style• Things to note:

• No more @android duplicates

12

Page 24: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

• Custom Style Extending Appcompat Style• Things to note:

• No more @android duplicates• No more v14+ Style Folder

12

Page 25: Android Lollipop - Webinar am 11.12.2014

13

Page 26: Android Lollipop - Webinar am 11.12.2014

13

Page 27: Android Lollipop - Webinar am 11.12.2014

13

Page 28: Android Lollipop - Webinar am 11.12.2014

13

Page 29: Android Lollipop - Webinar am 11.12.2014

13

Page 30: Android Lollipop - Webinar am 11.12.2014

13

Page 31: Android Lollipop - Webinar am 11.12.2014

13

Page 32: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme

14

Page 33: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme • Ui Elements that Get Material Design:

• EditText• Spinner• CheckBox• RadioButton• Switch• CheckedTextView

14

Page 34: Android Lollipop - Webinar am 11.12.2014

Apply Material Theme • Ui Elements that Get Material Design:

• EditText• Spinner• CheckBox• RadioButton• Switch• CheckedTextView

• All Other UI Elements do not get Styled and Need Custom Styling/Views

14

Page 35: Android Lollipop - Webinar am 11.12.2014

Action Bar Drawer Toggle

15

Page 36: Android Lollipop - Webinar am 11.12.2014

16

Action Bar Drawer Toggle

Page 37: Android Lollipop - Webinar am 11.12.2014

16

Action Bar Drawer Toggle

Page 38: Android Lollipop - Webinar am 11.12.2014

Action Bar Drawer Toggle

17

Page 39: Android Lollipop - Webinar am 11.12.2014

Action Bar Drawer Toggle

• import android.support.v7.app.ActionBarDrawerToggle

• Extend from ActionBarActivity• Init DrawerToggle with Drawer Layout• Assign DrawerToggle to DrawerLayout

17

Page 40: Android Lollipop - Webinar am 11.12.2014

18

Page 41: Android Lollipop - Webinar am 11.12.2014

18

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Page 42: Android Lollipop - Webinar am 11.12.2014

18

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Page 43: Android Lollipop - Webinar am 11.12.2014

18

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Page 44: Android Lollipop - Webinar am 11.12.2014

18

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Page 45: Android Lollipop - Webinar am 11.12.2014

18

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

DrawerLayout mDrawerLayout; ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);

drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { };

mDrawerLayout.setDrawerListener(drawerToggle);

getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }

Page 46: Android Lollipop - Webinar am 11.12.2014

Card View

19

Page 47: Android Lollipop - Webinar am 11.12.2014

Card View

20

Page 48: Android Lollipop - Webinar am 11.12.2014

Card View

• Support for rounded Corners• Elevation Shadows

20

Page 49: Android Lollipop - Webinar am 11.12.2014

Card View

• Support for rounded Corners• Elevation Shadows

• Limitations:• On Pre-L no Clipping for Children with

Round Corners• On Pre-L Adds Padding to Draw

Shadows

20

Page 50: Android Lollipop - Webinar am 11.12.2014

21

Page 51: Android Lollipop - Webinar am 11.12.2014

22

Page 52: Android Lollipop - Webinar am 11.12.2014

22

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cardView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:background="?android:selectableItemBackground" app:cardCornerRadius="2dp" app:cardElevation="5dp" app:cardPreventCornerOverlap="true" app:cardUseCompatPadding="true">

<!-- Place Your Textviews etc. in here --> <LinearLayout...> </android.support.v7.widget.CardView>

Page 53: Android Lollipop - Webinar am 11.12.2014

Recycler View

23

Page 54: Android Lollipop - Webinar am 11.12.2014

Recycler View

24

Page 55: Android Lollipop - Webinar am 11.12.2014

Recycler View

• „Replacement“ for ListView• Implements the ViewHolderPattern• Improved Recycling• LayoutManager

• Vertical List View• Horizontal List View• Staggered Grid View

24

Page 56: Android Lollipop - Webinar am 11.12.2014

25

Page 57: Android Lollipop - Webinar am 11.12.2014

25

Layout:

Page 58: Android Lollipop - Webinar am 11.12.2014

25

Layout:

Page 59: Android Lollipop - Webinar am 11.12.2014

25

Layout:

Code:

Page 60: Android Lollipop - Webinar am 11.12.2014

25

Layout:

Code:

Page 61: Android Lollipop - Webinar am 11.12.2014

26

Page 62: Android Lollipop - Webinar am 11.12.2014

27

Recycler View - Adapter

Page 63: Android Lollipop - Webinar am 11.12.2014

27

Recycler View - AdapterOld Adapter:class MenuAdapterOld extends ArrayAdapter<String> {

Page 64: Android Lollipop - Webinar am 11.12.2014

27

import android.support.v7.widget.RecyclerView;

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder> {

Recycler View - AdapterOld Adapter:class MenuAdapterOld extends ArrayAdapter<String> {

New Adapter:

Page 65: Android Lollipop - Webinar am 11.12.2014

28

Recycler View - Adapter

Page 66: Android Lollipop - Webinar am 11.12.2014

28

private ArrayList<String> mDataset; private OnItemClickListener mListener; public MenuAdapter(ArrayList<String> myDataset, OnItemClickListener listener) { mDataset = myDataset; mListener = listener; }

Recycler View - Adapter

Page 67: Android Lollipop - Webinar am 11.12.2014

29

Recycler View - Adapter

Page 68: Android Lollipop - Webinar am 11.12.2014

29

private ArrayList<String> mDataset; private OnItemClickListener mListener; public MenuAdapter(ArrayList<String> myDataset, OnItemClickListener listener) { mDataset = myDataset; mListener = listener; }

Recycler View - Adapter

Page 69: Android Lollipop - Webinar am 11.12.2014

29

private ArrayList<String> mDataset; private OnItemClickListener mListener; public MenuAdapter(ArrayList<String> myDataset, OnItemClickListener listener) { mDataset = myDataset; mListener = listener; }

Recycler View - Adapter

private ArrayList<String> mDataset; private OnItemClickListener mListener;public MenuAdapter(ArrayList<String> myDataset, OnItemClickListener listener) { mDataset = myDataset; mListener = listener;}

Page 70: Android Lollipop - Webinar am 11.12.2014

29

private ArrayList<String> mDataset; private OnItemClickListener mListener; public MenuAdapter(ArrayList<String> myDataset, OnItemClickListener listener) { mDataset = myDataset; mListener = listener; }

Recycler View - Adapter

private ArrayList<String> mDataset; private OnItemClickListener mListener;public MenuAdapter(ArrayList<String> myDataset, OnItemClickListener listener) { mDataset = myDataset; mListener = listener;}

@Overridepublic int getItemCount() { return mDataset.size(); }

Page 71: Android Lollipop - Webinar am 11.12.2014

30

Recycler View - Adapter

Page 72: Android Lollipop - Webinar am 11.12.2014

30

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

Recycler View - Adapter

Page 73: Android Lollipop - Webinar am 11.12.2014

30

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

Recycler View - Adapter

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

Page 74: Android Lollipop - Webinar am 11.12.2014

30

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

Recycler View - Adapter

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

Page 75: Android Lollipop - Webinar am 11.12.2014

30

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

Recycler View - Adapter

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

Page 76: Android Lollipop - Webinar am 11.12.2014

30

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

Recycler View - Adapter

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); } }

public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mPhoto; TextView mPhotoTitle; CardView mCardView; public ViewHolder(View itemView) { super(itemView); mPhoto = (ImageView) itemView.findViewById(R.id.photo); mPhotoTitle = (TextView) itemView.findViewById(R.id.photoTitle); mCardView = (CardView) itemView.findViewById(R.id.cardView); }}

Page 77: Android Lollipop - Webinar am 11.12.2014

31

Recycler View - Adapter

Page 78: Android Lollipop - Webinar am 11.12.2014

31

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } }); }

Recycler View - Adapter

Page 79: Android Lollipop - Webinar am 11.12.2014

31

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } }); }

Recycler View - Adapter

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

Page 80: Android Lollipop - Webinar am 11.12.2014

31

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } }); }

Recycler View - Adapter

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v);} @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

Page 81: Android Lollipop - Webinar am 11.12.2014

31

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } }); }

Recycler View - Adapter

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v);} @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v);} @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

Page 82: Android Lollipop - Webinar am 11.12.2014

31

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } }); }

Recycler View - Adapter

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v); } @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v);} @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v);} @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } });}

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); return new ViewHolder(v);} @Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i) { Photo p = photos.get(i); mPicasso.load(p.getUrl()).error(android.R.drawable.stat_notify_error).placeholder(android.R.drawable.stat_notify_sync).into(viewHolder.mPhoto); viewHolder.mPhotoTitle.setText(p.getId()); if (viewHolder.mPhotographerTitle != null) { viewHolder.mPhotographerTitle.setText(p.getTitle()); } viewHolder.mCardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onClick(viewHolder.mPhoto, i); } }); }

Page 83: Android Lollipop - Webinar am 11.12.2014

32

Page 84: Android Lollipop - Webinar am 11.12.2014

32

• Linear Layout Manager

Page 85: Android Lollipop - Webinar am 11.12.2014

32

• Linear Layout Manager

• Supports Smooth Scrolling

Page 86: Android Lollipop - Webinar am 11.12.2014

32

• Linear Layout Manager

• Supports Smooth Scrolling

Page 87: Android Lollipop - Webinar am 11.12.2014

33

Page 88: Android Lollipop - Webinar am 11.12.2014

33

• Linear Layout Manager

Page 89: Android Lollipop - Webinar am 11.12.2014

33

• Linear Layout Manager

• Orientation Horizontal

Page 90: Android Lollipop - Webinar am 11.12.2014

33

• Linear Layout Manager

• Orientation Horizontal

Page 91: Android Lollipop - Webinar am 11.12.2014

34

Page 92: Android Lollipop - Webinar am 11.12.2014

34

• Staggered Grid Layout Manager

Page 93: Android Lollipop - Webinar am 11.12.2014

34

• Staggered Grid Layout Manager

• Grid Size can be defined

Page 94: Android Lollipop - Webinar am 11.12.2014

34

• Staggered Grid Layout Manager

• Grid Size can be defined

• Supports Vertical and Horizontal Scrolling

Page 95: Android Lollipop - Webinar am 11.12.2014

34

• Staggered Grid Layout Manager

• Grid Size can be defined

• Supports Vertical and Horizontal Scrolling

Page 96: Android Lollipop - Webinar am 11.12.2014

Toolbar

35

Page 97: Android Lollipop - Webinar am 11.12.2014
Page 98: Android Lollipop - Webinar am 11.12.2014

Toolbar

37

Page 99: Android Lollipop - Webinar am 11.12.2014

Toolbar

• ActionBar == Toolbar

• Toolbar is a ViewGroup• Styleable• Positionable

37

Page 100: Android Lollipop - Webinar am 11.12.2014

38

Layout:

Code:

Page 101: Android Lollipop - Webinar am 11.12.2014

39

Standalone Widget:

Page 102: Android Lollipop - Webinar am 11.12.2014

Limitations

40

Page 103: Android Lollipop - Webinar am 11.12.2014

Limitations

41

Page 104: Android Lollipop - Webinar am 11.12.2014

Limitations

• Activity Transitions are Possible, BUT won’t be applied on PRE 5.0 Devices

• Many „New“ Ui Elements are not available in the API, thus require separate Implementation/Style.

41

Page 105: Android Lollipop - Webinar am 11.12.2014

Limitations

42

Page 106: Android Lollipop - Webinar am 11.12.2014

Limitations

• Elements not Included:• Fancy Material Progressbars• Buttons

• Flat• Raised• Round / Floating

• Sliders• Snackbars

42

Page 107: Android Lollipop - Webinar am 11.12.2014

Limitations

43

Page 108: Android Lollipop - Webinar am 11.12.2014

Limitations

• Things not Supported on Pre 5.0:• Activity transitions• Touch feedback• Reveal animations• Path-based animations• Vector drawables• Drawable tinting

43

Page 109: Android Lollipop - Webinar am 11.12.2014

44

Useful Links

Page 110: Android Lollipop - Webinar am 11.12.2014

Useful Links

• Official Documentation: http://developer.android.com/tools/support-library/index.html

• Index for Open Source Libraries: https://android-arsenal.com/

• e.G. Missing Ui Elements

45

Page 111: Android Lollipop - Webinar am 11.12.2014
Page 112: Android Lollipop - Webinar am 11.12.2014

s3xy4ngycs3xy4ngyc

Questions?s3xy4ngyc

AngeloRüggeberg

twitter.com/

google.com/+

.github.iogithub.com/

s3xy4ngycs3xy4ngyc