关于 actionbar 的意义,作用什么的就不说了,总结一下我从谷歌文档中看到的一些比较重要的东西。


android ProgressBar 为什么一直转动_android

ActionBar 一般都是上图这样的,最左边是应用的图标,中间是一些 tabs,右边是 action item。当然,我们可以通过设置属性来控制他们是否显示甚至是整个 ActionBar 是否显示。


1. 控制 ActionBar 是否显示

android 3.0版本以后,所有 activity 默认都带 ActionBar,是因为所有 activity 默认的 theme 都是 “Theme.Holo” 或者是它的派生theme。

要想控制 ActionBar 是否显示,有几种方法:

1)。设置 activity 的 theme 为 “Theme.Holo.NoActionBar”,这种方式最为彻底,在程序中 ActionBar 就找不回来了,调用 getActionBar() 会返回 null。

2)。在代码中动态设置,调用 ActionBar 的 hide() 方法可以使 ActionBar 消失,再调用 show() 方法可以让它重新显示。

注意:在第二种方法中,调用 hide() 或者 show() 会引起视图的重新布局(re-layout)。因为默认情况下,ActionBar 是占据布局空间的。当你将它隐藏时,系统会重新布局以使得程序界面能够充分利用屏幕空间(把 ActionBar 节省下来的空间也用上),当你让 ActionBar 重新显示时,也是一个道理。

如果你不希望在隐藏/打开 ActionBar 的时候,引发重新布局,你可以新建一个 style,里面将 android:windowActionBarOverlay 设置为 true。然后让你的 application 或者某一个 activity 使用这个 theme。这样的话,ActionBar 就会画在你的布局上方,所以你打开/以藏 它都不会影响你的布局了。如下所示:

<style name="TabTheme" parent="AppTheme">
    <item name="android:windowActionBarOverlay">true</item>
</style>


2. 添加 action item 相关

关于 menu 的那篇文章中说到,3.0版本以后,Optins Menu 中的 item 可以显示到 ActionBar 上。事实上,ActionBar 的用处之一就是给 Options Menu 中的某些比较重要的选项提供直接支持,是用户可以很方便的看到和使用。当然,哪些选项是重要的由我们自己决定,可以通过在 item 标签下设置 android:showAsAction 属性来设定。

一个 action item 可以包含一个图标(icon)和(或)一个 名称(title)。如果都有,系统默认在 ActionBar 上只显示图标。如果你也想显示名称(在 ActionBar 上显示的时候),可以给 android:showAsAction 属性设置上 “withText”。但是即使设置了。名称也不是一定会显示,只有在 ActionBar 上有空间的时候,才会显示。

尽管如上一段所说,我们给 action item 设置的名称不一定会显示出来,但是我们还是应该给每一个 action item 都设置名称。因为当这个 action item 没有显示在 ActionBar 上面的时候,即会出现在所谓的 “overflow menu” 中,此时只显示 item 的名称。

我们长按出现在 ActionBar 上的 item 的图标,系统会自动弹出它的名称来给予提示。


3. 我们可以通过在 manifest.xml 文件中的 <activity> 标签下设置 uiOptions="splitActionBarWhenNarrow" 来分割 ActionBar。

android ProgressBar 为什么一直转动_ide_02

如上图所示,下面那一条是 ActionBar,上面是绑定在它上面的 tabs。如果没有设置 uiOptions="splitActionBarWhenNarrow",他们都应该显示在上面。

这个属性并不是只适用于这一种情况,当屏幕相对于 ActionBar 上的内容来讲比较“窄”的时候,这是属性就会起作用。


4. 给 ActionBar 上的应用图标添加功能

上文说过,可以设置不显示应用图标。它默认是显示的,但是不具有任何功能,我们可以在它显示的时候,给它添加功能。

添加功能的步骤是:

1)。调用 ActionBar 的 api 函数:setHomeButtonEnabled(true),告诉系统这个应用图标是可以有点击事件的,使得在点击应用图标后,系统会调用 onOptionsItemSelected 方法来处理。这一步在4.0以下的版本上是不需要的。

2)。在 onOptionsItemSelected 函数处理操作,点击应用图标对应的 id 是 android.R.id.home。捕捉到这个id后,在下面写你的操作。

它对应的功能一般就是两种(当然你也可以提供其他的):

1)。返回到该应用的 home activity。谷歌提示:如果是这个功能的话,在用于打开 home activity 的 intent 中,最好设置 FLAG_ACTIVITY_CLEAR_TOP  和 FLAG_ACTIVITY_NEW_TASK。

2)。返回到该应用的结构树的上一层(这个稍难理解,我后面会学习然后写一下)。如果要提供这个操作的话,可以先调用 ActionBar 的api函数 setDisplayHomeAsUpEnabled 为true。设置这个, 只是告诉系统你想要提供这个功能,系统会自动在你的应用图标前加上一个“箭头”。具体的操作还需要你在 onOptionsItemSelected 方法中写。


5. 添加 action view。

action view 大家见的最多的就是“搜索”。点击“搜索”图标之后,会出现一个 edittext 让你输入关键字。这就是一个 action view。

关于它,首先要明白一点就是,action view 是设置给 MenuItem 的,这样的话,关于 action view 的一些函数,就都是 MenuItem 提供的。

添加 action view 有两种方法:

1)。在 menu 对应的 xml 文件中添加,通过 android:actionViewClass 或者 android:actionLayout 来添加;

2)。在代码中动态 添加。应该是在 onCreateOptionsMenu 中,获取到对应的 MenuItem 对象,然后调用该对象的 setActionView 方法来添加。

下面说几点扩充的。

1)。可以给 action view 设置各种监听事件,只要获取到了 action view 对象,您就随意设置吧。调用 MenuItem 的 getActionView 方法获取 action view 对象。

2)。可以通过 MenuItem 手动控制 action view 的展开和闭合。分别是 expandActionVIew 和 collapseActionView 方法。

3)。可以调用 MenuItem 的 setOnActionExpandListener 来监听 action view 的展开和闭合。


6. 使用 Action Provider

这个说起来就很困难了,我会提供例子,下面只是总结几点。

使用 Action Provider 很简单,像下面这样就可以了。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_share"
          android:title="@string/share"
          android:showAsAction="ifRoom"
          android:actionProviderClass="android.widget.ShareActionProvider" />
    ...
</menu>



通过 android:actionProviderClass 指定了 Action Provider对应的类,这就可以了,之后还要做什么得看你使用的 Action Provider的具体实现了。

一个 Action Provider 它帮你做了许多事,帮你提供在 ActionBar 上使用的图标以及它的点击事件,帮你提供当 item 处于 overflow menu 中时的点击事件,但是不提供标题,所以 android:title 还是要自己设置。

下面说一下 android 系统提供的 ShareActionProvider 的用法。

1)。像上面那样定义一个 item。

2)。在 onCreateOptionsMenu 中获取到这个 item,通过它获取到设置在里面的 ShareActionProvider 对象,然后调用这个对象的 setShareIntent 方法,将你自己定义的一个 intent 对象传进去。然后,当你点击 ActionBar 上面的 分享 图标时,ShareActionProvider 就会根据你传入的这个 intent 去寻找合适的 activity,然后给你显示出来,供你选择。

ShareActionProvider 显示出来的列表是经过排序的,排序的依据是每个 activity 的使用频率,从大到小排,他们的频率都被保存在一个文件中。频率最高的那个会被显示在 Action Bar 中。

那么如何自定义一个我们的 Action Provider 呢?

只要写一个类继承 ActionProvider 类就可以了。要注意的是:

1)。保存在构造函数中传入的 context 对象。

2)。覆写 onCreateActionView 函数,返回要显示在 Action Bar 上的 图标。在这里面设置图标的点击事件。

3)。覆写 onPerformDefaultAction 函数。这个方法用于处理 当 item 显示在 overflow menu 中时 的点击事件。

4)。覆写 onPrepareSubMenu 函数来提供子菜单,如果有子菜单的话。与之相关的还有一个 hasMenu 函数。


7. 给 ActionBar 添加 tab

ActionBar 中的 tab 是设计来和 fragment 关联的。

添加 tab 很简单:

1)。调用 ActionBar 的 setNavigationMode(ActionBar.NAVIGATION_MODE_TABS) 来使 tabs 可见。

2)。实例化一个 ActionBar.tab 对象,并通过 ActionBar 的 addTab 方发将其添加进去。

3)。给每个 tab 设置 onTabListener 来处理相关事件。

有一点要注意,就是 tab 之间的切换也能引起重新布局。


8. 给 ActionBar 添加 Drop_Down list

1)。调用 ActionBar 的 setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)

2)。调用 ActionBar 的 setNavigationCallbacks。参数一看就懂,自己实现即可。


actionbar 的例子看此处:


9. 给 ActionBar 添加 customView(自定义view)

1)。调用 ActionBar 的 setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);

2)。调用 ActionBar 的 setCustomVIew 传入自定义的view

3)。设置点击事件可以通过 ActionBar 的 getCustomView.findViewById 来获取控件,然后添加点击事件即可。