Contenu connexe Similaire à Android Support Libraries (20) Plus de Kelly Shuster (8) Android Support Libraries13. 2015
@KellyShuster
★ annotations
★ design support
★ custom tabs support
★ percent support
★ app recommendation support (TV)
★ V7 preference support
★ V14 preference support
★ V17 preference support (TV)
15. 2016
@KellyShuster
★ vector drawable support
★ v4 library split
○ support-compat
○ support-core-utils
○ support-core-ui
○ support-media-compat
○ support-fragment
★ exifInterface support
18. @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
25. 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"
...
}
26. 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 "
...
}
32. TextView textView = (TextView) findViewById(R.id.text);
ViewCompat.setElevation(textView, elevationInPx);
33. TextView textView = (TextView) findViewById(R.id.text);
ViewCompat.setElevation(textView, elevationInPx);
34. TextView textView = (TextView) findViewById(R.id.text);
ViewCompat.setElevation(textView, elevationInPx);
★ no lint warning
★ no compile error
★ just doesn’t work on pre-21 :(
40. 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
41. 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.
42. PagerAdapter adapter = new CustomPagerAdapter(myData);
ViewPager viewPager = findViewById(R.id.vpager);
viewPager.setAdapter(adapter);
activity java file
47. public class CustomPagerAdapter extends PagerAdapter {
. . .
@Override
public CharSequence getPageTitle(int position) {
return String.format("Title #%s", position);
}
. . .
}
custom pager adapter
48. 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
52. <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Customize your theme here. -->
</style>
styles xml file
54. Toolbar toolbar = (Toolbar) findViewById(R.id.t_toolbar);
setSupportActionBar(toolbar);
activity java file
69. 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();
}
});
70. 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();
}
});
71. 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();
}
});
72. 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();
}
});
85. @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));
}
86. @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));
}
87. @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));
}
88. @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));
}
104. <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>
105. <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>
106. android {
defaultConfig {
. . .
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
. . .
compile "com.android.support:support-vector-drawable:26.0.0"
}
107. android {
defaultConfig {
. . .
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
. . .
compile "com.android.support:support-vector-drawable:26.0.0"
}
108. android {
defaultConfig {
. . .
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
. . .
compile "com.android.support:support-vector-drawable:26.0.0"
}
111. ImageView ivBugDroid = (ImageView) findViewById(imageView);
ivBugDroid.setImageDrawable(AppCompatResources.getDrawable(
this, R.drawable.ic_android_black_24dp));
112. ImageView ivBugDroid = (ImageView) findViewById(imageView);
ivBugDroid.setImageDrawable(AppCompatResources.getDrawable(
this, R.drawable.ic_android_black_24dp));
122. 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
123. 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
129. <?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>
130. <?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>
131. 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;
}
});
132. 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;
}
});
133. 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;
}
});
145. TextView textView2 = (TextView) findViewById(R.id.text2);
Typeface tfBelleFair = ResourcesCompat.getFont(
this, R.font.bellefair_regular);
textView2.setTypeface(tfBelleFair);
146. TextView textView2 = (TextView) findViewById(R.id.text2);
Typeface tfBelleFair = ResourcesCompat.getFont(
this, R.font.bellefair_regular);
textView2.setTypeface(tfBelleFair);
160. All instances of the
findViewById() method now return
<T extends View> T
instead of
View
165. 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