SlideShare a Scribd company logo
the android
support libraries @KellyShuster
Android Support Libraries
quick
history
@KellyShuster
2011
@KellyShuster
2011
@KellyShuster
★ v4 support library
★ v13 support library
2012
@KellyShuster
2012
@KellyShuster
2013
@KellyShuster
2013
@KellyShuster
★ v7 gridlayout
★ v7 appcompat
○ ActionBar
○ ActionBarActivity
★ V8 renderscript
2014
@KellyShuster
2014
@KellyShuster
★ v7 cardview
★ v7 recyclerview
★ v7 palette
★ v17 leanback
★ wear UI
2015
@KellyShuster
2015
@KellyShuster
★ annotations
★ design support
★ custom tabs support
★ percent support
★ app recommendation support (TV)
★ V7 preference support
★ V14 preference support
★ V17 preference support (TV)
2016
@KellyShuster
2016
@KellyShuster
★ vector drawable support
★ v4 library split
○ support-compat
○ support-core-utils
○ support-core-ui
○ support-media-compat
○ support-fragment
★ exifInterface support
2017
@KellyShuster
2017
@KellyShuster
★ dynamic animation
★ emoji compat
@KellyShuster
★ v4 support library
★ v13 support library
★ v7 gridlayout
★ v7 appcompat
★ V8 renderscript
★ v7 cardview
★ v7 recyclerview
★ v7 palette
★ v17 leanback
★ wear UI
★ annotations
★ design support
★ custom tabs support
★ percent support
★ app recommendation support (TV)
★ V7 preference support
★ V14 preference support
★ V17 preference support (TV)
★ vector drawable support
★ v4 library split
○ support-compat
○ support-core-utils
○ support-core-ui
○ support-media-compat
○ support-fragment
★ exifInterface support
★ dynamic animation
★ emoji compat
a few
general
tips @KellyShuster
appcompat-v7:25.1.0
@KellyShuster
appcompat-v7:25.1.0
@KellyShuster
appcompat-v7:25.1.0
@KellyShuster
appcompat-v7:25.1.0
@KellyShuster
nope
dependencies {
compile "com.android.support:appcompat-v7:25.1.0"
compile "com.android.support:recyclerview-v7:25.1.0"
compile "com.android.support:design:25.1.0"
...
}
buildscript {
ext.support_lib_version = '25.1.0'
...
}
dependencies {
compile "com.android.support:appcompat-v7:25.1.0"
compile "com.android.support:recyclerview-v7:25.1.0"
compile "com.android.support:design:25.1.0"
...
}
buildscript {
ext.support_lib_version = '25.1.0'
...
}
dependencies {
compile "com.android.support:appcompat-v7: $support_lib_version "
compile "com.android.support:recyclerview-v7: $support_lib_version "
compile "com.android.support:design: $support_lib_version "
...
}
Android Support Libraries
./gradlew -q dependencies app:dependencies
Android Support Libraries
Android Support Libraries
beware
stubbed
methods! @KellyShuster
TextView textView = (TextView) findViewById(R.id.text);
ViewCompat.setElevation(textView, elevationInPx);
TextView textView = (TextView) findViewById(R.id.text);
ViewCompat.setElevation(textView, elevationInPx);
TextView textView = (TextView) findViewById(R.id.text);
ViewCompat.setElevation(textView, elevationInPx);
★ no lint warning
★ no compile error
★ just doesn’t work on pre-21 :(
popular
components @KellyShuster
appcompat-v7
ViewPager @KellyShuster
Android Support Libraries
Android Support Libraries
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/vpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
layout xml file
public class CustomPagerAdapter extends PagerAdapter {
private ArrayList<String> myData;
@Override
public Object instantiateItem(ViewGroup container, int position) {
FrameLayout flPage = (FrameLayout) LayoutInflater
.from(container.getContext())
.inflate(R.layout.page_layout, null, false);
TextView mytext = flPage.findViewById(R.id.pager_text);
mytext.setText(strings.get(position));
container.addView(flPage);
return flPage;
}
. . .
}
Custom pager adapter
public class CustomPagerAdapter extends PagerAdapter {
. . .
@Override
public int getCount() {
return myData.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return (view == object);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object){
ViewPager pager = (ViewPager) container;
FrameLayout flPage = (FrameLayout) object;
pager.removeView(flPage);
}
}
custom pager adapter, cont’d.
PagerAdapter adapter = new CustomPagerAdapter(myData);
ViewPager viewPager = findViewById(R.id.vpager);
viewPager.setAdapter(adapter);
activity java file
design
TabLayout @KellyShuster
Android Support Libraries
Android Support Libraries
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"/>
<android.support.v4.view.ViewPager
android:id="@+id/vpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
layout xml file
public class CustomPagerAdapter extends PagerAdapter {
. . .
@Override
public CharSequence getPageTitle(int position) {
return String.format("Title #%s", position);
}
. . .
}
custom pager adapter
PagerAdapter adapter = new CustomPagerAdapter(myData);
ViewPager viewPager = findViewById(R.id.vpager);
viewPager.setAdapter(adapter);
TabLayout tabLayout = findViewById(R.id.tablayout);
tabLayout.setupWithViewPager(viewPager, true);
activity java file
appcompat-v7
Toolbar @KellyShuster
Android Support Libraries
Android Support Libraries
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Customize your theme here. -->
</style>
styles xml file
<android.support.v7.widget.Toolbar
android:id="@+id/t_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize">
<LinearLayout>
<ImageView />
<TextView />
</LinearLayout>
</android.support.v7.widget.Toolbar>
layout xml file
Toolbar toolbar = (Toolbar) findViewById(R.id.t_toolbar);
setSupportActionBar(toolbar);
activity java file
design
CoordinatorLayout @KellyShuster
Android Support Libraries
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView>
<LinearLayout/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView>
<LinearLayout/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView>
<LinearLayout/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView>
<LinearLayout/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView>
<LinearLayout/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout
app:layout_scrollFlags="scroll|enterAlways"
app:contentScrim="?attr/colorPrimary">
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout
app:layout_scrollFlags="scroll|enterAlways"
app:contentScrim="?attr/colorPrimary">
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<!-- Toolbar -->
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout
app:layout_scrollFlags="scroll|enterAlways"
app:contentScrim="?attr/colorPrimary">
<include layout="@layout/view_toolbar_image" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Main Content -->
<android.support.v4.widget.NestedScrollView
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
design
FloatingActionButton
Snackbar
Android Support Libraries
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"/>
FloatingActionButton fab =
(FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make( view,
"Yay, I love 360|AnDev!",
Snackbar.LENGTH_SHORT)
.show();
}
});
FloatingActionButton fab =
(FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make( view,
"Yay, I love 360|AnDev!",
Snackbar.LENGTH_SHORT)
.show();
}
});
FloatingActionButton fab =
(FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make( view,
"Yay, I love 360|AnDev!",
Snackbar.LENGTH_SHORT)
.show();
}
});
FloatingActionButton fab =
(FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make( view,
"Yay, I love 360|AnDev!",
Snackbar.LENGTH_SHORT)
.show();
}
});
Android Support Libraries
<android.support.design.widget.CoordinatorLayout>
<LinearLayout>
<TextView />
</LinearLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"/>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.CoordinatorLayout>
<LinearLayout>
<TextView />
</LinearLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"/>
</android.support.design.widget.CoordinatorLayout>
design
TextInputLayout
Android Support Libraries
<android.support.design.widget.TextInputLayout
android:id="@+id/til_first_name"
style="@style/Theme.TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/Theme.TextInputLayoutError">
<TextInputEditText
android:id="@+id/tiet_first_name"
style="@style/Theme.EditText.NewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/common_hint_first_name"
android:imeOptions="actionNext"
android:inputType="textPersonName"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/til_first_name"
style="@style/Theme.TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/Theme.TextInputLayoutError">
<TextInputEditText
android:id="@+id/tiet_first_name"
style="@style/Theme.EditText.NewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/common_hint_first_name"
android:imeOptions="actionNext"
android:inputType="textPersonName"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/til_first_name"
style="@style/Theme.TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/Theme.TextInputLayoutError">
<TextInputEditText
android:id="@+id/tiet_first_name"
style="@style/Theme.EditText.NewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/common_hint_first_name"
android:imeOptions="actionNext"
android:inputType="textPersonName"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/til_first_name"
style="@style/Theme.TextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/Theme.TextInputLayoutError">
<TextInputEditText
android:id="@+id/tiet_first_name"
style="@style/Theme.EditText.NewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/common_hint_first_name"
android:imeOptions="actionNext"
android:inputType="textPersonName"/>
</android.support.design.widget.TextInputLayout>
<style name="Theme.TextInputLayout" parent="TextAppearance.AppCompat">
<!-- Static state: Hint color -->
<item name="android:textColorHint">@color/gray_94</item>
<item name="android:textColor">@color/gray_94</item>
<!-- Focused state: Hint style -->
<item name="hintTextAppearance">@style/Theme.Text.Subhead.Reg.94</item>
</style>
styles
<style name="Theme.TextInputLayoutError" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/darkest_pink</item>
</style>
styles
<style name="Theme.EditText.NewStyle"
parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Static state: Bottom line color -->
<item name="colorControlNormal">@color/gray_cb</item>
<!-- Focused state: Bottom line color -->
<item name="colorControlActivated">@color/gray_cb</item>
<item name="android:textColor">@color/gray_4a</item>
<item name="android:textColorHighlight">@color/gray_cb</item>
. . .
</style>
styles
@Override
public void setFirstNameInputStateValid() {
tilFirstName.setError(null);
tilFirstName.setErrorEnabled(false);
}
@Override
public void setFirstNameInputStateError() {
tilFirstName.setErrorEnabled(true);
tilFirstName.setError(getString(
R.string.common_invalid_first_name));
}
@Override
public void setFirstNameInputStateValid() {
tilFirstName.setError(null);
tilFirstName.setErrorEnabled(false);
}
@Override
public void setFirstNameInputStateError() {
tilFirstName.setErrorEnabled(true);
tilFirstName.setError(getString(
R.string.common_invalid_first_name));
}
@Override
public void setFirstNameInputStateValid() {
tilFirstName.setError(null);
tilFirstName.setErrorEnabled(false);
}
@Override
public void setFirstNameInputStateError() {
tilFirstName.setErrorEnabled(true);
tilFirstName.setError(getString(
R.string.common_invalid_first_name));
}
@Override
public void setFirstNameInputStateValid() {
tilFirstName.setError(null);
tilFirstName.setErrorEnabled(false);
}
@Override
public void setFirstNameInputStateError() {
tilFirstName.setErrorEnabled(true);
tilFirstName.setError(getString(
R.string.common_invalid_first_name));
}
Android Support Libraries
Android Support Libraries
Android Support Libraries
Android Support Libraries
percent
PercentRelativeLayout
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/centered_image_2"
android:layout_gravity="center"
android:contentDescription="Android Robot"
android:src="@mipmap/ic_launcher"
app:layout_heightPercent="30%"
app:layout_widthPercent="50%"/>
</android.support.percent.PercentRelativeLayout>
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/centered_image_2"
android:layout_gravity="center"
android:contentDescription="Android Robot"
android:src="@mipmap/ic_launcher"
app:layout_heightPercent="30%"
app:layout_widthPercent="50%"/>
</android.support.percent.PercentRelativeLayout>
Android Support Libraries
constraint-layout
ConstraintLayout
Android Support Libraries
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Constraint Layout Demo"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"/>
</android.support.constraint.ConstraintLayout>
support-vector-drawable
vector
Android Support Libraries
Android Support Libraries
Android Support Libraries
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M6,18c0,0.55 0.45,1 1,1h1v3.5c0,0.83 0.67,1.5
1.5,1.5s1.5,-0.67 1.5,-1.5L11,19h2v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67
1.5,-1.5L16,19h1c0.55,0 1,-0.45 1,-1L18,8L6,8v10zM3.5,8C2.67,8 2,8.67
2,9.5v7c0,0.83 0.67,1.5 1.5,1.5S5,17.33 5,16.5v-7C5,8.67 4.33,8
3.5,8zM20.5,8c-0.83,0 -1.5,0.67 -1.5,1.5v7c0,0.83 0.67,1.5
1.5,1.5s1.5,-0.67 1.5,-1.5v-7c0,-0.83 -0.67,-1.5
-1.5,-1.5zM15.53,2.16l1.3,-1.3c0.2,-0.2 0.2,-0.51 0,-0.71 -0.2,-0.2
-0.51,-0.2 -0.71,0l-1.48,1.48C13.85,1.23 12.95,1 12,1c-0.96,0 -1.86,0.23
-2.66,0.63L7.85,0.15c-0.2,-0.2 -0.51,-0.2 -0.71,0 -0.2,0.2 -0.2,0.51
0,0.71l1.31,1.31C6.97,3.26 6,5.01 6,7h12c0,-1.99 -0.97,-3.75
-2.47,-4.84zM10,5L9,5L9,4h1v1zM15,5h-1L14,4h1v1z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M6,18c0,0.55 0.45,1 1,1h1v3.5c0,0.83 0.67,1.5
1.5,1.5s1.5,-0.67 1.5,-1.5L11,19h2v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67
1.5,-1.5L16,19h1c0.55,0 1,-0.45 1,-1L18,8L6,8v10zM3.5,8C2.67,8 2,8.67
2,9.5v7c0,0.83 0.67,1.5 1.5,1.5S5,17.33 5,16.5v-7C5,8.67 4.33,8
3.5,8zM20.5,8c-0.83,0 -1.5,0.67 -1.5,1.5v7c0,0.83 0.67,1.5
1.5,1.5s1.5,-0.67 1.5,-1.5v-7c0,-0.83 -0.67,-1.5
-1.5,-1.5zM15.53,2.16l1.3,-1.3c0.2,-0.2 0.2,-0.51 0,-0.71 -0.2,-0.2
-0.51,-0.2 -0.71,0l-1.48,1.48C13.85,1.23 12.95,1 12,1c-0.96,0 -1.86,0.23
-2.66,0.63L7.85,0.15c-0.2,-0.2 -0.51,-0.2 -0.71,0 -0.2,0.2 -0.2,0.51
0,0.71l1.31,1.31C6.97,3.26 6,5.01 6,7h12c0,-1.99 -0.97,-3.75
-2.47,-4.84zM10,5L9,5L9,4h1v1zM15,5h-1L14,4h1v1z"/>
</vector>
android {
defaultConfig {
. . .
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
. . .
compile "com.android.support:support-vector-drawable:26.0.0"
}
android {
defaultConfig {
. . .
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
. . .
compile "com.android.support:support-vector-drawable:26.0.0"
}
android {
defaultConfig {
. . .
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
. . .
compile "com.android.support:support-vector-drawable:26.0.0"
}
<ImageView
android:id="@+id/imageView"
android:layout_width="240dp"
android:layout_height="280dp"
android:layout_centerInParent="true"
app:srcCompat="@drawable/ic_android_black_24dp"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="240dp"
android:layout_height="280dp"
android:layout_centerInParent="true"
app:srcCompat="@drawable/ic_android_black_24dp"/>
ImageView ivBugDroid = (ImageView) findViewById(imageView);
ivBugDroid.setImageDrawable(AppCompatResources.getDrawable(
this, R.drawable.ic_android_black_24dp));
ImageView ivBugDroid = (ImageView) findViewById(imageView);
ivBugDroid.setImageDrawable(AppCompatResources.getDrawable(
this, R.drawable.ic_android_black_24dp));
<ImageView
android:id="@+id/imageView"
android:layout_width="240dp"
android:layout_height="280dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_android_black_24dp"/>
Android Support Libraries
Android Support Libraries
25.0.0
to
25.3.1 @KellyShuster
support-v7
ArraySet
ArraySet
@KellyShuster
★ previously only available in API 23+
ArraySet
@KellyShuster
★ previously only available in API 23+
★ now in v4 lib as of 25.1.0
ArraySet
@KellyShuster
★ previously only available in API 23+
★ now in v4 lib as of 25.1.0
★ more efficient than traditional HashSet
ArraySet
@KellyShuster
★ previously only available in API 23+
★ now in v4 lib as of 25.1.0
★ more efficient than traditional HashSet
★ similar to ArrayMap, but contains only 1 item
per entry
ArraySet
@KellyShuster
★ previously only available in API 23+
★ now in v4 Lib as of 25.1.0
★ more efficient than traditional HashSet
★ similar to ArrayMap, but contains only 1 item
per entry
★ not for large items (slower than HashSet)
○ hundreds of items == OK
ArraySet
@KellyShuster
★ previously only available in API 23+
★ now in v4 Lib as of 25.1.0
★ more efficient than traditional HashSet
★ similar to ArrayMap, but contains only 1 item
per entry
★ not for large items (slower than HashSet)
○ hundreds of items == OK
★ shrinks as items are removed
○ you have no control over shrinking
Android Support Libraries
design
BottomNavigationView
Android Support Libraries
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_nav_items"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_nav_items"/>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_search"
android:title="Search (black)"
android:icon="@android:drawable/ic_menu_search" />
<item android:id="@+id/action_camera"
android:title="Camera (blue)"
android:icon="@android:drawable/ic_menu_camera" />
<item android:id="@+id/action_email"
android:title="Email (red)"
android:icon="@android:drawable/ic_dialog_email" />
</menu>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_search"
android:title="Search (black)"
android:icon="@android:drawable/ic_menu_search" />
<item android:id="@+id/action_camera"
android:title="Camera (blue)"
android:icon="@android:drawable/ic_menu_camera" />
<item android:id="@+id/action_email"
android:title="Email (red)"
android:icon="@android:drawable/ic_dialog_email" />
</menu>
BottomNavigationView bottomNav = (BottomNavigationView) findViewById(R.id.bottom_nav);
bottomNav.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_search:
ivBugDroid.setImageDrawable(...);
return true;
case R.id.action_camera:
ivBugDroid.setImageDrawable(...);
return true;
case R.id.action_email:
ivBugDroid.setImageDrawable(...);
return true;
}
return false;
}
});
BottomNavigationView bottomNav = (BottomNavigationView) findViewById(R.id.bottom_nav);
bottomNav.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_search:
ivBugDroid.setImageDrawable(...);
return true;
case R.id.action_camera:
ivBugDroid.setImageDrawable(...);
return true;
case R.id.action_email:
ivBugDroid.setImageDrawable(...);
return true;
}
return false;
}
});
BottomNavigationView bottomNav = (BottomNavigationView) findViewById(R.id.bottom_nav);
bottomNav.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_search:
ivBugDroid.setImageDrawable(...);
return true;
case R.id.action_camera:
ivBugDroid.setImageDrawable(...);
return true;
case R.id.action_email:
ivBugDroid.setImageDrawable(...);
return true;
}
return false;
}
});
Android Support Libraries
what’s
new in
support 26 @KellyShuster
API 14+
maven support @KellyShuster
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
fonts @KellyShuster
Android Support Libraries
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/button_constraint"
android:layout_margin="10dp"
android:fontFamily="@font/bellefair_regular"
android:text="This is fancy stuff!"
android:textSize="24dp"
android:visibility="visible"/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/button_constraint"
android:layout_margin="10dp"
android:fontFamily="@font/bellefair_regular"
android:text="This is fancy stuff!"
android:textSize="24dp"
android:visibility="visible"/>
TextView textView2 = (TextView) findViewById(R.id.text2);
Typeface tfBelleFair = ResourcesCompat.getFont(
this, R.font.bellefair_regular);
textView2.setTypeface(tfBelleFair);
TextView textView2 = (TextView) findViewById(R.id.text2);
Typeface tfBelleFair = ResourcesCompat.getFont(
this, R.font.bellefair_regular);
textView2.setTypeface(tfBelleFair);
font
families @KellyShuster
<font-family
xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:font="@font/bellefair_regular"
app:fontStyle="normal"
app:fontWeight="400"/>
</font-family>
<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
<item name="android:fontFamily">@font/bellefair_regular</item>
</style>
<TextView
android:id="@+id/text2"
style="@style/customfontstyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text"
android:layout_margin="10dp"
android:text="This is regular stuff"
android:textSize="24dp"
android:visibility="visible"/>
autoscale
TextView @KellyShuster
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="Layout Height 100dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="10dp"
android:text="Layout Height 10dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="Layout Height 100dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="10dp"
android:text="Layout Height 10dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="Layout Height 100dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="10dp"
android:text="Layout Height 10dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="Layout Height 100dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="10dp"
android:text="Layout Height 10dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="Layout Height 100dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="10dp"
android:text="Layout Height 10dp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"/>
Android Support Libraries
Android Support Libraries
findViewById @KellyShuster
All instances of the
findViewById() method now return
<T extends View> T
instead of
View
Android Support Libraries
Android Support Libraries
thank
you! @KellyShuster
Resources
● Coordinator Layout
https://medium.com/google-developers/intercepting-everything-with-coordinatorlayout-behaviors-8c6adc140c26
● Huyen Tue Dao “Cool Constraint Layout”https://www.youtube.com/watch?v=Xx4aRI3oQbM
● Bottom Navigation View flow https://material.io/guidelines/components/bottom-navigation.html#
● Google IO What’s New in Support Library 2017https://www.youtube.com/watch?v=V6-roIeNUY0
References
● Royal Gorge Bridge http://royalgorgebridge.com/
● Snackbar gif https://material.io/guidelines/components/snackbars-toasts.html#snackbars-toasts-usage
● TextInputLayout Images
https://stackoverflow.com/questions/35775919/edittext-added-is-not-a-textinputedittext-please-switch-to-us
ing-that-class-ins
● Crying Pikachu gif https://giphy.com/search/sad-pikachu
● Ice Cream Sandwich http://cookdiary.net/ice-cream-sandwich/
● Happy Pokemon gif
http://rebloggy.com/post/gif-pikachu-pokemon-happy-good-yay-aww-yes-jump-shiny-togepi-bulbasaur-jumping-g/
77419268976
● SVG icon http://www.clker.com/clipart-336030.html

More Related Content

PDF
Overview of Android Infrastructure
PDF
Overview of Android Infrastructure
PDF
Material Design and Backwards Compatibility
PDF
Android Lollipop - Webinar am 11.12.2014
PDF
안드로이드 데이터 바인딩
PDF
How to code to code less
KEY
CDI e as ideias pro futuro do VRaptor
PDF
Architecture and RxJava
Overview of Android Infrastructure
Overview of Android Infrastructure
Material Design and Backwards Compatibility
Android Lollipop - Webinar am 11.12.2014
안드로이드 데이터 바인딩
How to code to code less
CDI e as ideias pro futuro do VRaptor
Architecture and RxJava

Similar to Android Support Libraries (20)

PPTX
Embracing the Lollipop
PDF
Building Modern Apps using Android Architecture Components
PDF
Recyclerview in action
PDF
Fragments anyone
PDF
Android accessibility for developers and QA
PDF
Architecture Components In Real Life Season 2
PDF
Service Oriented Architecture in Magento 2
PPTX
Developing Android and iOS Apps With C#, .NET, Xamarin, Mono, and Windows Azure
PDF
Web automation with #d8rules (European Drupal Days 2015)
PDF
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
PDF
07_UIAndroid.pdf
PDF
Android Design Patterns
PDF
Nicola Corti - Building UI Consistent Android Apps - Codemotion Milan 2017
PPTX
Android dev toolbox
PPTX
Modern android development
KEY
Android workshop
PDF
Binding business data to vaadin components
PDF
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
PDF
My way to clean android (EN) - Android day salamanca edition
PDF
Geb Best Practices
Embracing the Lollipop
Building Modern Apps using Android Architecture Components
Recyclerview in action
Fragments anyone
Android accessibility for developers and QA
Architecture Components In Real Life Season 2
Service Oriented Architecture in Magento 2
Developing Android and iOS Apps With C#, .NET, Xamarin, Mono, and Windows Azure
Web automation with #d8rules (European Drupal Days 2015)
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
07_UIAndroid.pdf
Android Design Patterns
Nicola Corti - Building UI Consistent Android Apps - Codemotion Milan 2017
Android dev toolbox
Modern android development
Android workshop
Binding business data to vaadin components
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
My way to clean android (EN) - Android day salamanca edition
Geb Best Practices
Ad

More from Kelly Shuster (8)

PDF
Technical speaking 101
PDF
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
PDF
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
PDF
Lightning Talk on Programming Accessible Software
PDF
Android Accessibility - Droidcon London
PDF
Android Internal Library Management
PDF
Intro to Android (WWC Denver July 2015)
PDF
Android Accessibility - DroidCon Berlin 2015
Technical speaking 101
Let's Build Software Everyone Can Use (Denver Startup Week 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Lightning Talk on Programming Accessible Software
Android Accessibility - Droidcon London
Android Internal Library Management
Intro to Android (WWC Denver July 2015)
Android Accessibility - DroidCon Berlin 2015
Ad

Recently uploaded (20)

PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
System and Network Administraation Chapter 3
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Transform Your Business with a Software ERP System
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
Introduction to Artificial Intelligence
PPTX
ai tools demonstartion for schools and inter college
PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
AI in Product Development-omnex systems
PDF
medical staffing services at VALiNTRY
PPTX
L1 - Introduction to python Backend.pptx
PDF
Understanding Forklifts - TECH EHS Solution
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
top salesforce developer skills in 2025.pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
System and Network Administraation Chapter 3
Which alternative to Crystal Reports is best for small or large businesses.pdf
Transform Your Business with a Software ERP System
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Introduction to Artificial Intelligence
ai tools demonstartion for schools and inter college
Reimagine Home Health with the Power of Agentic AI​
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Design an Analysis of Algorithms II-SECS-1021-03
How Creative Agencies Leverage Project Management Software.pdf
Upgrade and Innovation Strategies for SAP ERP Customers
AI in Product Development-omnex systems
medical staffing services at VALiNTRY
L1 - Introduction to python Backend.pptx
Understanding Forklifts - TECH EHS Solution
Odoo POS Development Services by CandidRoot Solutions
top salesforce developer skills in 2025.pdf

Android Support Libraries