ActionBar是Android 3.0以后Anrdoid系统增加的导航栏功能控件。它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。由于ActionBar是在3.0以后的版本中加入的,如果想在2.x的版本里使用ActionBar的话则需要引入Support Library。

1. 系统默认Actionbar用法简介

首先介绍在Android 3.0以上的系统中使用系统默认的Actionbar的使用方法。在3.0以上的系统中,通过直接集成最基础的Activity即可使用Actionbar。

在onCreate中设置Actionbar

ActionBar actionBar = getActionBar();
if (actionBar != null) {
    actionBar.setLogo(R.drawable.ic_logo);//自定义logo
    actionBar.setDisplayUseLogoEnabled(true);//使能用户自定义logo
    actionBar.setHomeButtonEnabled(true);//设置actionBar的Home键可点击
}

在子界面中我们可以配置返回上一级的操作,此时actionbar中会多出一个返回箭头。onCreate中可以做如下的操作:

mActionBar = getActionBar();
if (mActionBar != null){
    mActionBar.setDisplayHomeAsUpEnabled(true);//设置Home按键作为返回上一级
    mActionBar.setDisplayShowHomeEnabled(false);//不显示Home键Icon
}

另外还需要在AndroidManifest.xml的Activity中配置android:parentActivityName属性。

<activity
    android:name="SubActivity"
    android:parentActivityName="ParentActivity"/>

2. 为Actionbar添加菜单项

首先需要在res/menu/下新建一个menu文件menu_set.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	xmlns:tools="http://schemas.android.com/tools"
	tools:context="com.test.test.MainActivity">
	<item
		android:id="@+id/refresh"
		android:orderInCategory="100"
		android:title="/刷新"
		android:icon="@drawable/ic_refresh"
		android:showAsAction="always"/>
	<item
		android:id="@+id/setting"
		android:orderInCategory="100"
		android:title="设置"
		android:icon="@drawable/ic_settings"
		android:showAsAction="ifRoom"/>
	<item
		android:id="@+id/play"
		android:orderInCategory="100"
		android:title="退出"		
		android:icon="@drawable/ic_exit"
		android:showAsAction="never"/>
</menu>

Menu 标签中 Item 标签的主要属性包括:

属性名

定义

android:orderInCategory

表示每个 item 的优先级,值越大优先级越低, actionbar 地方不够就会放到 overflow 中

android:title

item 的标题

android:icon

item 显示的图标

android:showAsAction

item 显示的方式

其中 showAsAction 属性接包含以下一些定义:

属性

说明

ifRoom

会显示在 Item 中,但是如果已经有 4 个或者 4 个以上的 Item 时会隐藏在溢出列表中。

当然个数并不仅仅局限于 4 个,依据屏幕的宽窄而定

never

永远不会显示。只会在溢出列表中显示,而且只显示标题,

所以在定义 item 的时候,最好把标题都带上

always

无论是否溢出,总会显示

withText

withText 值示意 Action bar 要显示文本标题。 Action bar 会尽可能的显示这个标题,但是,

如果图标有效并且受到 Action bar 空间的限制,文本标题有可能显示不全

collapseActionView

声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。

否则,这个操作视窗在默认的情况下是不可见的。一般要配合 ifRoom 一起使用才会有效果

定义好menu配置文件后,在代码中加载menu。

public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_set, menu);
        return true;
    }

而通过重写onOptionsItemSelected,即可对相应菜单的select事件进行处理。
在一些有物理菜单按钮的机器上,默认情况下overflow按钮可能会出现显示不出来的情况,通过onCreate中调用以下函数即可显示出来。

/**
 * 即使有物理菜单键也显示ActionBar的flowMenu
 */
public static void showOverflowMenu(Context context) {
    try {
        ViewConfiguration config = ViewConfiguration.get(context);
        //使用java反射技术,获取getDeclaredField类的私有属性sHasPermanentMenuKey
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if(menuKeyField != null){
            menuKeyField.setAccessible(true); //将属性设为可访问的
            menuKeyField.setBoolean(config, false);  //为属性赋值为false
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3.Actionbar样式自定义

ActionBar默认的样式是很丑陋的,所以下面简单的介绍一下如何进行自定义ActionBar的样式。

<style name="AppThemeBase" parent="android:Theme.Holo">
    <item name="android:actionOverflowButtonStyle">@style/actionbar_overflow</item>//overflow按钮样式,即最右边点击弹出隐藏菜单项的按钮
    <item name="android:actionBarStyle">@style/actionbar_style</item>//actionbar样式
    <item name="android:homeAsUpIndicator">@drawable/icon_back</item>//设置上一级按钮图标资源
    <item name="android:windowActionBarOverlay">true</item>//设置actionbar悬浮显示
</style>

<style name="actionbar_overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
    <item name="android:src">@drawable/ic_overflow</item>//设置overflow按钮图标
</style>

<style name="actionbar_style" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:background">@color/backgnd</item>//设置actionbar背景颜色,可以设置为半透明的颜色
    <item name="android:titleTextStyle">@style/actionbar_title_text</item>//设置标题文字样式
</style>

<style name="actionbar_title_text" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textSize">18dp</item>//设置文字大小
</style>

同过上面的例子,我们就可以举一反三的定义自己想要的样式。