AppCompat v21 — Android 5.0之前版本设备的Material Design实现
博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打开,请翻墙。

Android 5.0 SDK在上周五发布,它以新的UI控件、材料设计-我们专注于良好设计的可视化语言为特色。为了能够让你把最新的设计应用到之前的Android平台上,我们扩展了我们的支持包,包括具有较大更新的AppCompat,同样还有新的RecyclerView、CardView和Patette包。
AppCompat新特性
AppCompat(也叫ActionBarCompat)开始的时候是作为运行在Gingerbread上面的设备的Android 4.0 ActionBar API的相反移植,提供了紧接相反移植实现和框架实现的通用API层。 AppCompat v21交付了与Android 5.0一样最新的API和特性集。
在本次发布中,Android引进了新的Toolbar控件。它是给了你更多可控性和灵活性的Action Bar模式的泛化。就像其它的一样,在层次结构中,Toolbar只是一个视图,但却使得与其它视图交错、产生动画效果和对滑动事件产生回应更加容易。你也可以把它设置为Activity的action bar,这意味着标准选项按钮活动将展示在Toolbar里面。
最新更新的AppCompat,你可以已经在使用了一段时间,在过去几周中,它已经包含在多种Google应用更新中,如Play Store, Play Newsstand。它也已经集成到Android应用Google I/O中,就像上面的图片展示的那样,当然,Google I/O是开源的。
设置
如果你在使用Gradle,那么请把AppCompat在你的build.gradle文件中作为一个依赖添加进去。
dependencies {
compile "com.android.support:appcompat-v7:21.0.+"
}
新整合
如果你当前没在使用AppCompat,或者正要重头开始,下面将告诉你如何设置:
- 所有的Activity必须继承自ActionBarActivity,当然,ActionBarActivity继承自v4支持包中的FragmentActivity,这样你就可以继续使用fragment。
- 所有的主题(想要使用Action Bar/Toolbar)必须继承自Theme.AppCompat。其中有许多的变体可用,包括Light和NoActionBar。
- 在Action Bar上填充展示任何东西(例如在toolbar中列表导航的SpinnerAdapter)时,确保使用action bar的特定主题context时,通过getSupportActionBar().getThemedContext()获得。
- 必须为MenuItem中的任何有关action的调用使用MenuItemCompat中的静态方法。
想获取更多信息,请查看Action Bar API入门,它是有关AppCompat的综合性入门。
从先前设置中迁移
对于大多数应用,只需要在values/下声明一个主题:
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<!-- Set AppCompat’s actionBarStyle -->
<item name="actionBarStyle">@style/MyActionBarStyle</item>
<!-- Set AppCompat’s color theming attrs -->
<item name=”colorPrimary”>@color/my_awesome_red</item>
<item name=”colorPrimaryDark”>@color/my_awesome_darker_red</item>
<!-- The rest of your attributes -->
</style>
你现在可以移除有关values-v14+的所有Action Bar风格了。
定制主题
AppCompat支持新的调色板属性,从而允许你可以轻易地自定义主题以通过primary和accent色彩来适配你的品牌。例如:
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<!-- colorPrimary is used for the default action bar background -->
<item name=”colorPrimary”>@color/my_awesome_color</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name=”colorPrimaryDark”>@color/my_awesome_darker_color</item>
<!-- colorAccent is used as the default value for colorControlActivated,
which is used to tint widgets -->
<item name=”colorAccent”>@color/accent</item>
<!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight, and colorSwitchThumbNormal. -->
</style>
当你设置这些属性时,AppCompat自动扩散这些值到API 21+上面的框架属性。它将自动地为状态条和任务概览着色。
在更老平台上,AppCompat在任何可能的地方模拟这种颜色主题。只是此时,为action bar和一些控件着色受到限制。
控件着色
运行在Android 5.0上的设备时,所有的控件都是通过刚刚讨论过的颜色主题属性着色。有两个特性允许在Lollipop上进行控件着色:drawable着色和在drawable中引用主题属性(如attr/foo的形式)。
- AppCompat为之前Android版本的以下控件子集提供相似的行为:
- AppCompat Toolbar提供的一切(action模式等)
- EditText
- Spinner
- CheckBox
- RadioButton
- Switch(使用新的android.support.v7.widget.SwitchCompat)
- CheckedTextView
为了使这些控件起作用,你不必做任何特别的事,只需要像往常一样在布局中使用这些控制信息,AppCompat将会完成其余的事情。
Toolbar控件

AppCompat完全支持Toolbar而且,Toolbar拥有同行于框架控件的特性和API。在AppCompat中,Toolbar在android.support.v7.widget.Toolbar类中实现。有两种方式使用Toolbar:
在想要使用业已存在的Action Bar设备但想要更多地控制界面时(如菜单填充和选择,ActionBarDrawerToggle等等),把Toolbar当Action Bar一样使用。
对于Action Bar不支持的场景,当想要在应用中使用这种模式时,使用单独的Toolbar;例如,在屏幕上展示多个工具条,悬跨部分宽度等等。
Action Bar
为了把Toolbar当Action Bar一样使用,首先要禁用提供装饰品的Action Bar。最简单的方式是使用继承自Theme.AppCompat.NoActionBar(或它的Light变体)的主题。
其次,通常通过布局文件创建Toolbar实例:
<android.support.v7.widget.Toolbar
android:id=”@+id/my_awesome_toolbar”
android:layout_height=”wrap_content”
android:layout_width=”match_parent”
android:minHeight=”?attr/actionBarSize”
android:background=”?attr/colorPrimary” />
高度、宽度、背景等等,完全取决于你;这些就是好的例子。因为Toolbar也只是一个ViewGroup,你可以给它设置任何你想要的风格和大小。
然后在Activity划Fragment中,把Toolbar设置为你的Action Bar:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.blah);
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
}
从这里之后,所有的菜单选项将会展示在Toolbar中,并通过标准选项菜单回调来产生之后的代码。
脱机使用
脱机模式的不同在于不必设置Toolbar像Action Bar一样活动。由此,可以使用任何AppCompat主题,且不必禁用提供装饰的Action Bar。
在脱机模式下,需要手工地通过content/actions来产生Toolbar相关的代码。例如,如果想要展示action,你需要在里面填充菜单:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.blah);
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
// Set an OnMenuItemClickListener to handle menu item clicks
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// Handle the menu item
return true;
}
});
// Inflate a menu to be displayed in the toolbar
toolbar.inflateMenu(R.menu.your_toolbar_menu);
}
有了Toolbar,你可以做许多其它的事件。想要获取更多的的信息,请参见Toolbar API。
定制风格
对于标准Action Bar,Toolbar的风格定制是完成的不一样的,是直接设置在它的视图上的。
当把Toolbar当Action Bar使用时,应用使用如下基本的风格:
<android.support.v7.widget.Toolbar
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
app:theme声明将确保文本和子项在使用solid色彩。
DarkActionBar
可以使用布局属性来直接设置Toolbar实例的风格。为了获取一个看起来像DarkActionBar(dark内容,light overflow menu)的Toolbar,提供了theme和popupTheme属性:
<android.support.v7.widget.Toolbar
android:layout_height=”wrap_content”
android:layout_width=”match_parent”
android:minHeight=”@dimen/triple_height_toolbar”
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
SearchView控件
AppCompat提供了Lollipop更新过的SearchView API,它是可以高度自定义和风格设置化的。我们现在使用Lollipop风格结构而不是老的searchview*主题属性.
如下设置SearchView属性:
values/themes.xml:
<style name=”Theme.MyTheme” parent=”Theme.AppCompat”>
<item name=”searchViewStyle”>@style/MySearchViewStyle</item>
</style>
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
<!-- Background for the search query section (e.g. EditText) -->
<item name="queryBackground">...</item>
<!-- Background for the actions section (e.g. voice, submit) -->
<item name="submitBackground">...</item>
<!-- Close button icon -->
<item name="closeIcon">...</item>
<!-- Search button icon -->
<item name="searchIcon">...</item>
<!-- Go/commit button icon -->
<item name="goIcon">...</item>
<!-- Voice search button icon -->
<item name="voiceIcon">...</item>
<!-- Commit icon shown in the query suggestion row -->
<item name="commitIcon">...</item>
<!-- Layout for query suggestion rows -->
<item name="suggestionRowLayout">...</item>
</style>
不必设置全部属性,默认值对大多数应用起作用。
Toolbar即将到来……
我希望,这篇博客能够帮助你站起来和AppCompat一直奔跑并鼓励你创建优秀的材料设计风格的应用。如果你有任何有关AppCompat或者其它任何支持包的问题,请让我们在G+/Twitter的评论或者我们能够提供更多文档的地方知道。
AppCompat v21 — Android 5.0之前版本设备的Material Design实现的更多相关文章
- appcompat v21: 让 Android 5.0 前的设备支持 Material Design
1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...
- 对Android 8.0以上版本通知点击无效的一次分析
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...
- 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题
快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ...
- Android 9.0/P 版本推荐使用 HttpURLConnection
早在几年前,谷歌就推荐在Android2.3版本以上使用HttpURLConnection,而在即将正式发布的 Android P 版本中,谷歌彻底取消了对Apache HTTPClient的支持,针 ...
- Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程
博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...
- Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()
解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...
- Android入门3:从Toolbar到Material Design
在Android5.0(API 21)之后,Toolbar被Google推广,逐渐走入大家视野.具体关于Actionbar和Toolbar的对比就不多啰嗦了,跟着潮流走是没错的.下面先上张简单的效果图 ...
- Android源码大放送之material design类型
本文转载自:http://www.apkbus.com/android-243232-1-1.html 鉴于大家对源码的渴望,就算自己辛苦一点也要满足大家的需求,查看了几百个源码之后终于筛选出了这些精 ...
- 解决Android 4.0以上版本中OptionsMenu菜单不显示ICON图标的问题
在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 Me ...
随机推荐
- Jquery 分页插件 Jquery Pagination
Jquery 分页插件 Jquery Pagination 分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也 ...
- JavaScript的类型、值和变量的总结
前言:JavaScript的数据类型分为两类:原始类型和对象类型.5种原始类型:数字.字符串.布尔值.null(空).undefined(未定义).对象是属性的集合,每个属性都由“名/值对”(值可以是 ...
- ViewPager用法
第一图: 页面中填充内容是随机关键词飞入和飞出动画效果,随后会更新,如今请先无视吧 ---2015-02-27--- 两年后最终更新了,网上都能搜到的,哎 无奈太懒http://bl ...
- centos编译内核:no space left on device 解
1.问题:在下面的根文件夹中的原始源代码 编译出现 no space left on device 利用df -h 命令查看 根文件夹空间占用完成 2.将源代码改在其它空间非常足的地方编译 在make ...
- 初识Java——(Java学习笔记一)
冯诺依曼体系结构 JAVA核心优势:跨平台---通过JVM(java虚拟机)来实现 JVM:Java虚拟机的一种规范 标示符:只能以下划线.美元符号($).字母.数字组成,不能以数字开 ...
- 开始折腾cocos2d-x,使用批处理来创建项目
开始服用的时间来学习cocos2d-x该,尽管C和C++另外不咋.只是学习和记忆可能是更深层次的,现在发展: so从今天开始正式决定学会与自己的业余时间折腾吧,仅这51什么.昨天,在开发环境中建,Vi ...
- linux_sed 正则替换
目标 替换 test.data文件中的 原正则: (\d{4}[^)]*?) sed不支持 \d 改为0-9 测试 :head test.data| sed -r "s/([0-9]{4}[ ...
- elasticsearch的rest搜索--- 总述
目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0 三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 一.针对这次装B 的解释 因为现在又 ...
- Mysql sql声明召回2 --正则表达式
这里简单回顾mysql在过滤后的数据使用正则表达式时.主要利用每方法将样品,或添加一些简短的说明. 下面说说提前,使用正则表达式是用来过滤数据 REGEXPkeyword 基本字符相匹配: SELEC ...
- ASP.NET 5 (vNext)
ASP.NET 5 (vNext) 理解和入门 概述 ASP.NET 5 (又称为vNext) 是自ASP.NET产生15年以来一次革命性的更新, 我们可以从以下几点来理解其概貌和意义: ASP. ...