本文简单的介绍一下ActionBar。若有错误之处请多指教。html
Action Bar是Android 3.0以后引入的新的对象,它一般位于应用程序的顶部,是一个用来定义用户区域的Windows特性,系统可以很好根据不一样的屏幕配置来适应Action Bar的外观。ActionBar是咱们能够为activity实现的最重要的设计元素之一。其提供了多种 UI 特性,可让咱们的 app 与其余 Android app 保持较高的一致性,从而为用户所熟悉。java
其核心的功能包括:android
一个专门的空间用来显示你的app的标识(Logo),以及指出目前所处在app的哪一个页面。web
以一种可预见的方式访问重要的操做(好比搜索、建立、共享等)。app
支持导航和视图切换(经过Tabs和下拉列表)。ide
注意:仅支持 Android 3.0 及以上版本布局
ActionBar APIs第一次被添加进来是在Android 3.0(API lever 11) ,可是它在Support Library 兼容Android 2.1 (API level 7) 或者更高中也是可用的。优化
注意:要注意从合适的包中导入ActionBar 类:ui
若是 支持的 API 等级低于 11:
import android.support.v7.app.ActionBar
spa若是支持的 API 等级仅仅是 11和更高:
import android.app.ActionBar
Action Bar 容许咱们为当前环境下最重要的操做添加按钮。那些直接出如今 action bar 中的 icon 和/或文本被称做action buttons(操做按钮)。安排不下的或不足够重要的操做被隐藏在 action overflow (超出空间的action,译者注)中。
全部的操做按钮和 action overflow 中其余可用的条目都被定义在 menu资源 的 XML 文件中。经过在项目的res/menu
目录中新增一个 XML 文件来为 action bar 添加操做。
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 搜索, 应该做为动做按钮展现--> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" app:showAsAction="ifRoom" /> <!-- 设置, 在溢出菜单中展现 --> <item android:id="@+id/action_settings" android:title="@string/action_settings" app:showAsAction="never" /> </menu>
上述代码声明,当 action bar 有可用空间时,搜索操做将做为一个操做按钮来显示,但设置操做将一直只在 action overflow 中显示。(默认状况下,全部的操做都显示在 action overflow 中,但为每个操做指明设计意图是很好的作法。
icon 属性要求每张图片提供一个 resource id
。在 @drawable/
以后的名字必须是存储在项目目录res/drawable/
下位图图片的文件名。例如:ic_action_search.png
对应 "@drawable/ic_action_search"。一样地,title 属性使用经过 XML 文件定义在项目目录 res/values/
中的一个 string 资源
,详情请参见 建立一个简单的 UI 。
注意: 使用showAction属性时须要在其之上使用一个定义在<menu>标签中的用户自定义的命名空间,当使用Support Libray定义XML资源时这是必须的,由于这个属性在旧的Android Framework中是不存在的,因此你必需要为全部定义在Support Libray中的属性用本身的命令空间做为他们的前缀。
注意:当建立 icon 和其余 bitmap 图片时,要为不一样屏幕密度下的显示效果提供多个优化的版本,这一点很重要。在 支持不一样屏幕 课程中将会更详细地讨论。
要为 action bar 布局菜单条目,就要在 activity 中实现 onCreateOptionsMenu() 回调方法来 inflate
菜单资源从而获取 Menu 对象。例如:
@Override public boolean onCreateOptionsMenu(Menu menu) { // 为ActionBar扩展菜单项 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity_actions, menu); return super.onCreateOptionsMenu(menu); }
当用户按下某一个操做按钮或者 action overflow 中的其余条目,系统将调用 activity 中onOptionsItemSelected()的回调方法。在该方法的实现里面调用MenuItem的getItemId()来判断哪一个条目被按下 - 返回的 ID 会匹配咱们声明对应的 <item>
元素中 android:id
属性的值。
@Override public boolean onOptionsItemSelected(MenuItem item) { // 处理动做按钮的点击事件 switch (item.getItemId()) { case R.id.action_search: openSearch(); return true; case R.id.action_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } }
在不是程序入口的其余全部屏中(activity 不位于主屏时),须要在 action bar 中为用户提供一个导航到逻辑父屏的不是程序入口的其余全部屏中(activity 不位于主屏时),须要在 action bar 中为用户提供一个导航到逻辑父屏的up button(向上按钮)。
图 2. Gmail 中的 up button。
当运行在 Android 4.1(API level 16) 或更高版本,或者使用 Support 库中的 ActionBarActivity 时,实现向上导航须要在 manifest 文件中声明父 activity ,同时在 action bar 中设置向上按钮可用。
在 manifest 中声明一个 activity 的父类,例如:
<application ... > ... <!-- 主 main/home 活动 (没有上级活动) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- 主活动的一个子活动--> <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- meta-data 用于支持 support 4.0 以及如下来指明上级活动 --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
而后,经过调用setDisplayHomeAsUpEnabled() 来把 app icon 设置成可用的向上按钮:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_displaymessage); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 若是你的minSdkVersion属性是11活更高, 应该这么用: // getActionBar().setDisplayHomeAsUpEnabled(true);}
因为系统已经知道 MainActivity
是 DisplayMessageActivity
的父 activity,当用户按下向上按钮时,系统会导航到恰当的父 activity , 你不须要去处理向上按钮的事件。
也能够重写 getSupportParentActivityIntent()
and onCreateSupportNavigateUpTaskStack()
在你的activity 中,详细见https://developer.android.com/guide/topics/ui/actionbar.html。
manifests/AndroidManifest.xml
<activity android:theme="@style/Theme.AppCompat.Light" ... >
普通属性:
actionBarStyle:这是一个特殊的的样式资源,经过它能够为ActionBar定义不少样式。Widget.AppCompat.ActionBar 这个颜色默认的样式,你应该使用它做为父样式。
background :背景。
backgroundStacked : 层叠背景。
backgroundSplit :split背景。
actionButtonStyle :action按钮样式,使用
Widget.AppCompat.ActionButton
, 做为其父样式。
actionOverflowButtonStyle 使用
Widget.AppCompat.ActionButton.Overflow
, 做为其父样式。
displayOptions 定义一个或者多个呈现样式
, 例如是否使用logo, Activity标题 等等,详细查看官方文档。
divider:分割。
titleTextStyle:标题样式。使用
TextAppearance.AppCompat.Widget.ActionBar.Title
,做为其父样式。
Android包含两个基本的 activity 主题,这两个主题决定了 action bar 的颜色:
Theme.Holo, 一个 “dark” 的主题
Theme.Holo.Light ,一个 “light” 的主题
这些主题便可以被应用到 app 全局,也能够经过在 manifest 文件中设置 <application>
元素 或 <activity>
元素的 android:theme
属性,对单一的 activity 进行设置。
例如:
<application android:theme="@android:style/Theme.Holo.Light" ... />
能够经过声明 activity 的主题为 Theme.Holo.Light.DarkActionBar 来达到以下效果:action bar 为dark,其余部分为light。
当使用 Support 库时,必须使用 Theme.AppCompat 主题替代:
Theme.AppCompat,一个“dark”的主题
Theme.AppCompat.Light,一个“light”的主题
Theme.AppCompat.Light.DarkActionBar,一个带有“dark” action bar 的“light”主题
必定要确保咱们使用的 action bar icon 的颜色与 action bar 自己的颜色有差别。Action Bar Icon Pack 为 Holo “dark”和“light”的 action bar 提供了标准的 action icon。
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 应用于程序或者活动的主题 --> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <!-- ActionBar 样式 --> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="android:background">@drawable/actionbar_background</item> </style> </resources>
修改 action bar 中的文本颜色,须要分别设置每一个元素的属性:
Action bar 的标题:建立一种自定义样式,并指定 textColor
属性;同时,在自定义的 actionBarStyle中为 titleTextStyle 属性指定为刚才的自定义样式。
注意:被应用到 titleTextStyle 的自定义样式应该使用 TextAppearance.Holo.Widget.ActionBar.Title 做为父样式。
Action bar tabs:在 activity 主题中重写 actionBarTabTextStyle
Action 按钮:在 activity 主题中重写 actionMenuTextColor
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 应用于程序或者活动的主题 --> <style name="CustomActionBarTheme" parent="@style/Theme.Holo"> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item> <item name="android:actionMenuTextColor">@color/actionbar_text</item> </style> <!-- ActionBar 样式 --> <style name="MyActionBar" parent="@style/Widget.Holo.ActionBar"> <item name="android:titleTextStyle">@style/MyActionBarTitleText</item> </style> <!-- ActionBar 标题文本 --> <style name="MyActionBarTitleText" parent="@style/TextAppearance.Holo.Widget.ActionBar.Title"> <item name="android:textColor">@color/actionbar_text</item> </style> <!-- ActionBar Tab标签 文本样式 --> <style name="MyActionBarTabText" parent="@style/Widget.Holo.ActionBar.TabText"> <item name="android:textColor">@color/actionbar_text</item> </style> </resources>
这是对ActionBar的一次简单使用,本文中没有提到Navigation Tabs 、ShareActionProvider等,后续更新。