Android ActionBar(转)
本文内容
- 关于 ActionBar
- 必要条件
- 项目结构
- 环境
- 演示一:Action Bar 显示隐藏
- 演示二:Action Item 显示菜单选项
- 演示三:Action Home 启用“返回/向上”程序图标导航
- 演示四:Action View 显示 UI 组件

如果你想使用 ActionBarSherlock,那么最好先研习一下原生的 Android ActionBar。最近打算用 Android 自己写个 APP,用了三方库 ActionBarSherlock,我也是 Android 刚入门,能够实现一些常见的功能和效果,对 Android 已经有个总体的认识~但结果被 ActionBarSherlock 搞得很不爽,本来觉得应该不太会难啊,毕竟编程也有年头了(虽说我是搞 .NET C# 的,但 Java 跟 C# 有 90% 的相似度,微软搞 C# 的人,就是当初搞 Java 的人,C# 在 1.0 版本时的确很烂,直到 2.0 版本才大为改观。我没用 Java 做过项目,但也不至于对 Java 一无所知……),可搜索了一些资料和示例后,感觉,简单搞一下还行,但要达到做项目的程度,还是复杂了点,到现在都没能领会 ActionBarSherlock~
经过一晚的反思,我发现,我还是需要从头开始,研究一下原生的 Android ActionBar,当时只是大概看了一下……结果,也顺道解决了我的另一个问题。我们知道,编写电脑应用程序时,都会初始化页面,Android 也是如此,但我一致没搞明白,比如,Tab 页,或是 ViewPager 这样的效果,如何实现初始化每个页,或是每个 Pager。别告诉我 Fragment,我说的是实现的代码。
本文主要演示原生 Android ActionBar 的使用。包括:
- Action Bar 显示隐藏
- Action Item 显示菜单选项
- Action Home 启用“返回/向上”程序图标导航
- Action View 显示 UI 组件
但在正式说明原生 ActionBar 实现的一些功能前,先大概了解一下。
下载 Demo
(下载有错,请留言!)
关于ActionBar
“操作栏”对于 Android APP 来说是最重要的设计元素。它通常在应用运行的所有时间都待在屏幕顶部。
操作栏的主要目的是:
- 突出重要的操作(例如“新建”和“搜索”),并且可以方便的使用。
- 在应用内提供统一的导航和视图切换体验。
- 将较少使用的功能收集到“更多操作”菜单中,减少界面上的杂乱布局。
- 为你的应用提供一个展示其特点的空间。
如果你是编写 Android APP 新手,请注意操作栏是需要实现的最重要的设计元素。根据下面的指导来设计你的 APP,使其和 Android 核心应用达到统一的界面体验。
对于大多数应用,操作栏可以分割为 4 个不同的功能区域。

图 1 活动栏
- 1. 应用图标
应用图标是应用的标识。在应用图标的位置放置你自己的 logo。
注意:如果当时应用不在顶层界面,那么在图标左边放置一个向左的箭头,表示“向上”按钮,使用户可以回到上一级界面。“向上”按钮的更多细节,请查看 导航 一节。
- 2. 视图控制
如果你的 APP 通过多个不同的视图显示数据,那么视图控制区域将允许用户切换视图。可以使用下拉菜单或者标签控件来实现。
但如果你的 APP 没有多个视图,那么你可以在这里显示不可操作的内容,例如标题或者品牌信息。
- 3. 操作按钮
显示应用中最重的操作。如果图标放不下了,就自动移入“更多操作”菜单。
- 4. 更多操作
将使用频率低的操作放在这个菜单里。
区分这4个区域很重要。比如,应该在“操作按钮”区域放置那些操作,最常见的就是“搜索”,你总不能把使用频率这么高的操作“藏”在很深的位置吧,用户一定天天咒你~再比如,在“更多操作”区域,放置使用频率较低的操作,可以即便是使用较低,也要仔细安排那些操作的顺序~
参考 Andriod 关于操作栏 ActionBar 的设计原则
必要条件
ActionBar 是 Android 3.0 的重要更新之一。必须在 AndroidManifest.xml 文件的 SDK 配置中指定该应用的版本高于 11(Android 3.0 的版本号)。在本演示中,minSdkVersion 的值必须高于 14,如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.nativeactionbardemo"
android:versionCode="1"
android:versionName="1.0" >
<!-- 使用 ActionBar minSdkVersion 至少为 14 -->
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ActionBarTest"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light" >
</activity>
<activity
android:name=".ActionItemTest"
android:label="@string/app_name" >
</activity>
<activity
android:name=".FirstActivity"
android:label="@string/app_name" >
</activity>
<activity android:name=".SecondActivity" >
</activity>
<activity android:name=".ActionHomeTest" >
</activity>
<activity android:name=".ActionViewTest" >
</activity>
</application>
</manifest>
当你指定 minSdkVersion =14 后,低版本的真机就无法在 eclipse debug 中看到。虽然也有办法,但这不在本文讨论范围内。貌似现在 Android 4.0 或更高的手机已经很普遍了。但是如果你使用 ActionBarSherlock 库,并将它添加到你项目,就没问题了。
另外,注意 application 节和其内的 Activity 小节分别设置了不同的主题。
项目结构


图 2 项目结构 图 3 程序主界面
环境
- Windows 2008 R2 64 位
- Eclipse ADT V22.6.2,Android 4.4.2(API 19)
- SAMSUNG GT-8618,Android OS 4.1.2
演示一:Action Bar 显示隐藏

图 4 ActionBar 显示隐藏
当点击“隐藏ActionBar”按钮时,ActionBar 会隐藏掉。核心代码如下所示:
public class ActionBarTest extends Activity {
ActionBar actionBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_actionbar);
// 获取该Activity的ActionBar,
// 只有当应用主题没有关闭ActionBar时,该代码才能返回ActionBar
actionBar = getActionBar();
}
// 为“显示ActionBar”按钮定义事件处理方法
public void showActionBar(View source) {
// 显示ActionBar
actionBar.show();
}
// 为“隐藏ActionBar”按钮定义事件处理方法
public void hideActionBar(View source) {
// 隐藏ActionBar
actionBar.hide();
}
}
此段代码要求 minSdkVersion 的值必须高于 11。
演示二:Action Item 显示菜单选项

图 5 显示菜单选项
ActionBar 上有三种菜单:单选菜单、普通菜单、复选菜单。可以改变字体的大小和颜色。核心代码如下所示:
public class ActionItemTest extends Activity {
private TextView txt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_actionitem);
txt = (TextView) findViewById(R.id.txt);
}
/* 根据 XML 文件创建菜单 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflator = new MenuInflater(this);
// 状态R.menu.context对应的菜单,并添加到menu中
inflator.inflate(R.menu.activity_actionitem_menu, menu);
return super.onCreateOptionsMenu(menu);
}
/* 选项菜单的菜单项被单击后的回调方法 */
@Override
public boolean onOptionsItemSelected(MenuItem mi) {
if (mi.isCheckable()) {
mi.setChecked(true); // ②
}
// 判断单击的是哪个菜单项,并作出响应
switch (mi.getItemId()) {
case R.id.font_10:
txt.setTextSize(10 * 2);
break;
case R.id.font_12:
txt.setTextSize(12 * 2);
break;
case R.id.font_14:
txt.setTextSize(14 * 2);
break;
case R.id.font_16:
txt.setTextSize(16 * 2);
break;
case R.id.font_18:
txt.setTextSize(18 * 2);
break;
case R.id.red_font:
txt.setTextColor(Color.RED);
mi.setChecked(true);
break;
case R.id.green_font:
txt.setTextColor(Color.GREEN);
mi.setChecked(true);
break;
case R.id.blue_font:
txt.setTextColor(Color.BLUE);
mi.setChecked(true);
break;
case R.id.plain_item:
Toast toast = Toast.makeText(ActionItemTest.this, "您单击了普通菜单项",
Toast.LENGTH_SHORT);
toast.show();
break;
}
return true;
}
}
演示三:Action Home 启用“返回/向上”程序图标导航

图 6 启用“返回/向上”程序图标导航
- 第一个图是第一个 Activity;
- 第二个图中,当点击第一个图中的“启动第二个”按钮后,将进入第二个 Activity,并看到“启动第三个”字样;
- 第三个图中,当点击第二个图中的“启动第三个”按钮后,将进入下一个 Activity,跟演示二相同的界面。唯一的不同是,添加了“返回/向上”的功能;
- 第四个图中,当点击“程序图标导航”(还带了个向左的箭头),将返回到第一个图。
核心代码如下所示:
public class ActionHomeTest extends Activity {
private TextView txt;
ActionBar actionBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_actionhome);
txt = (TextView) findViewById(R.id.txt);
actionBar = getActionBar();
// 设置是否显示应用程序图标
actionBar.setDisplayShowHomeEnabled(true);
// 将应用程序图标设置为可点击的按钮
actionBar.setHomeButtonEnabled(true);
// 将应用程序图标设置为可点击的按钮,并在图标上添加向左箭头
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflator = new MenuInflater(this);
// 状态R.menu.context对应的菜单,并添加到menu中
inflator.inflate(R.menu.activity_actionitem_menu, menu);
return super.onCreateOptionsMenu(menu);
}
// 选项菜单的菜单项被单击后的回调方法
@Override
public boolean onOptionsItemSelected(MenuItem mi) {
if (mi.isCheckable()) {
mi.setChecked(true);
}
// 判断单击的是哪个菜单项,并作出响应。
switch (mi.getItemId()) {
case android.R.id.home:
// 创建启动FirstActivity的Intent
Intent intent = new Intent(this, FirstActivity.class);
// 添加额外的Flag,将Activity栈中处于FirstActivity之上的Activity弹出
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// 启动intent对应的Activity
startActivity(intent);
break;
case R.id.font_10:
txt.setTextSize(10 * 2);
break;
case R.id.font_12:
txt.setTextSize(12 * 2);
break;
case R.id.font_14:
txt.setTextSize(14 * 2);
break;
case R.id.font_16:
txt.setTextSize(16 * 2);
break;
case R.id.font_18:
txt.setTextSize(18 * 2);
break;
case R.id.red_font:
txt.setTextColor(Color.RED);
mi.setChecked(true);
break;
case R.id.green_font:
txt.setTextColor(Color.GREEN);
mi.setChecked(true);
break;
case R.id.blue_font:
txt.setTextColor(Color.BLUE);
mi.setChecked(true);
break;
case R.id.plain_item:
Toast toast = Toast.makeText(ActionHomeTest.this, "您单击了普通菜单项",
Toast.LENGTH_SHORT);
toast.show();
break;
}
return true;
}
}
此代码要求 minSdkVersion 的值必须高于 14。
此段代码除了可以了解如何启用“返回/向上”程序图标导航,以及如何让 Activity 入栈,以便点击“返回/向上”程序图标导航时,返回你指定的 Activity。
演示四:Action View 显示 UI 组件
ActionBar 除了可以显示普通的 Action Item 外,还可以显示普通的 UI 组件。
在 ActionBar 上添加 Action View 有两种方式:
- 定义 Action Item 时,使用 android:actionViewClass 属性指定 Action View 的实现类。
- 定义 Action Item 时,使用 android:actionLayout 属性指定 Action View 对应的视图资源,即 xml 文件。

图 7 显示 UI 组件
核心代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/search"
android:actionViewClass="android.widget.SearchView"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/menu_settings"/>
<item
android:id="@+id/progress"
android:actionLayout="@layout/clock"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/menu_settings"/>
</menu>
说明:id 为 Search 的菜单,指定的是 android.widget.SearchView 类;id 为 progress 的菜单,指定的是 clock.xml 文件。
Android ActionBar(转)的更多相关文章
- [Xamarin.Android] ActionBar Tips
[Xamarin.Android] ActionBar Tips ActionBar用途 快速搞懂 ActionBar的用途,可以参考下列文章: [Android]使用 ActionBarCompat ...
- Android ActionBar详解
Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ...
- Android ActionBar应用实战,高仿微信主界面的设计
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对 ...
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
- Android ActionBar全然解析,使用官方推荐的最佳导航栏(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc.我翻译之后又做了些加工 ...
- Android 原生 Android ActionBar
本文内容 关于 ActionBar 必要条件 项目结构 环境 演示一:Action Bar 显示隐藏 演示二:Action Item 显示菜单选项 演示三:Action Home 启用"返回 ...
- Android Actionbar Tab 导航模式
Android Actionbar Tab 下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果. 初次尝试 package com.example.it ...
- 【转】Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
随机推荐
- 我摘录的js代码
1.修改样式 document.getElementByIdx( "div1").style.display = "none"; 2.鼠标悬停图标变小手 sty ...
- 讯飞语音SDK Android平台使用
1. 支持功能介绍: 2. Android API主要业务接口和流程介绍 -------------------------------------------------------- 工程代码: ...
- C语言连接数据库
举个例子,连接SQL: // 打开数据库 strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet ...
- Node.js回调概念
什么是回调? 回调是一个异步等效的功能.在完成特定任务回调函数被调用. Node大量使用了回调.Node的所有的API都支持回调这样的一种方式. 例如,一个函数读取一个文件可能开始读取文件,并使得下一 ...
- [BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】
题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 DP ?) 可以发现,每一行和每一列的棋子个数不能 ...
- C 和 OC 字符串转换 NSString 和 char * 转换 const char* 与 char *
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { char *s = "He ...
- LINUX下安装ORACLE,完全搞定
参考文档: http://www.tuicool.com/articles/eE3mmy http://blog.chinaunix.net/uid-11209572-id-3599052.html
- /dev/random和/dev/urandom的一点备忘
1. 基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- QTP自传之录制
录制,是一件吃力不讨好的活.很多人以为录制就是我的主要甚至全部的功能,这是大错特错的.不过,录制功能却是不熟悉我的人了解我的有效途径,是大家学习的有力武器.今天就先从录制功能说起吧. 说到录制,就不得 ...