Android 关于 ActionBarSherlock 的使用
本文内容
- 使用
- 主题化
- ActionBarSherlock 演示项目
- 本文 ActionBarSherlock 简单演示
最近一个星期被 actionsherlock 搞得很不爽(光去足疗店就去了三次——减压),本来觉得应该不太会难啊(Android 已经基本入门),毕竟编程也有年头了(虽说我是搞 .NET C# 的,但 Java 跟 C# 有 90% 的相似度,微软搞 C# 的人,就是当初搞 Java 的人,C# 在 1.0 版本时的确很烂,直到 2.0 版本才大为改观。我没用 Java 做过项目,但也不至于对 Java 一无所知……),可搜索了一些资料和示例后,感觉,简单搞一下还行,但要达到做项目的程度,还是复杂了点,到现在都没能领会 ActionBarSherlock~
看来啊,还是在官网系统地看些资料从头来过吧。近期想自己写个 Android APP,若不用 ActionBarSherlock,貌似起点低了点啊~ActionBarSherlock 目前已经集成在 eclipse ADT 中,但据网上资料,若在 Android 4.0 以下的手机上使用 ActionBarSherlock ,比如我的真机是 Android 2.2.2,需要直接将 ActionBarSherlock 作为库加入到自己项目中(或是其 .jar 包)。
什么是 ActionBarSherlock?说白了,ActionBarSherlock 就是根据之前对操作栏设计和实践经验,在原生 Android 基础上扩展的一个库,为了便于使用,它在包名及其内部大量的类等在命名和位置上都与原生的 Android 相匹配。个人觉得,既然 ActionBarSherlock 是在原生 Android 基础上进行的一个增强的扩展,原生 Android 有的,ActionBarSherlock 也有,ActionBarSherlock 还有原生 Andorid 所有没有的,相当不错,那么要用 ActionBarSherlock,就用的彻底点,比如,自己的 Activity 和 Fragment 继承“Sherlock-”开头的类,别掺合着用,这样能减少错误的概率。而且掺合用,主题也不一致啊~在使用 ActionBarSherlock 之前,最好先看下原生 Android ActionBar 是如何使用。
Github 下载
本文简单演示下载
使用
与官方兼容库的主题粘合在一起的 ActionBarSherlock,目的是让用户可以使用操作栏的设计方式,该方式是在 Android Ice Cream Sandwich(Android 4.0) 中积累的经验。
在此之前,顶部操作栏的设计还是比较麻烦的,通常由四个部分组成,如下图 1 所示,从左到右,分别为“应用图标”、“视图控制”、“操作按钮”和“更多操作”,都需要自己弄,而且每个开发者对操作栏的设计可能不同,ActionBarSherlock 恰恰就是简化和规范操作栏的设计和实现。一句话,实践证明的、成熟的东西就要封装并强化成现成的东西。

图 1 Android 操作栏设计
Android Ice Cream Sandwich 是继 Froyo 后的下一个版本。因为,Android 系统版本混乱的局面一直困扰着 Android 开发者,Ice Cream Sandwich 解决两个问题:碎片(Fragment)设计,可以让应用在小屏幕上使用单个面板布局,在大屏幕上使用多个面板布局;帮助开发者驾驭不同尺寸的屏幕。
Android 4.0 Ice Cream Sandwich 冰欺凌三明治,Android 2.2 Froyo(缩写“frozen yogurt”),意为“冻酸奶”。Google 此前的一些版本还用过 Android 1.5 Cupcakes(杯形蛋糕)、Android 1.6 Donuts(甜甜圈)、Android 2.0/2.1 Eclairs(长形松饼)。另外,Android 2.3 Gingerbread(姜饼)、Android 3.0/3.1/3.2 Honeycomb(蜂窝)、Android 4.1/4.2/4.3 Jelly Bean(果冻豆)、Android 4.4 KitKat(奇巧巧克力棒)。命名遵循首字母 C、D、E、F ……顺序,还几乎都是吃的,难道 Google Andriod 的人都是吃货吗~
要求
由于 actionsherlock 使用了原生的操作栏(action bar)及其 Ice Cream Sandwich 的相关类,所以该库要求你必须使用 Android 4.0 或更高的版本来编译 actionsherlock 和你的项目。另外,也需要采用 JDK 1.6 或更高。
因为,actionsherlock 库是官方库的扩展,所以,必须在你项目中引用 android-support-v4.jar。
如何包含在你的项目
如果你使用 ADT 插件 0.9.7 版本或更高的 Eclipse 开发环境,那么你就可以把 ActionBarSherlock 引入到你的项目。
在 eclipse 中,利用现存的 actionbarsherlock/,创建一个新的 Android 项目。然后,右键点击你的项目“属性”,选择“Android”-“Library”,把 actionbarsherlock 项目作为库添加你的项目内。如图 2 所示:

图 2 将 actionbarsherlock 添加到你项目
其他方式包括使用 ant 从命令行编译,以及使用 maven 或 gradle 生成你的 Android 项目,请参看“ActionBarSherlock 官网”。
将 actionbarsherlock 库添加到你的项目后,可能会出现如下图所示的错误信息:
图 3 将 actionbarsherlock 添加到你项目后,可能出现的问题
这个错误信息的大概意思是,你新建的项目 mydemo 中的 android-support-v4.jar 与 actionbarsherlock 库中的不匹配,让你修复依赖。这个是完全有可能的,因为,eclipse ADT 的版本可能不一样,android-support-v4.jar 自然不同。只要将你的项目 mydemo/libs/android-support-v4.jar 覆盖到 actionbarsherlock/libs/android-support-v4.jar 就行。
Action Bar API
当创建一个 activity,在所有 Android 版本中使用操作栏时,你必须声明你的 activity 继承以“Sherlock-”开头的任何一个类(例如,SherlockActivity,SherlockFragmentActivity)。与操作栏的交互是通过调用 getSupportActionBar()(而不是 getActionBar())。
由 ActionBar 实例公开的 API 是原生方法(native method) 公开的一个完全的副本。在“Related Links”小节,参阅其文档,以及如何使用它。
注意: 当使用 SherlockFragmentActivity 时,也要使用“Sherlock-”前缀开头的 fragment 类,这样才能确保正确的功能(例如,SherlockFragment、SherlockListFragment)。该 activity 仍然与正常的 fragment 类功能一样,但你将不能使用任何的菜单相关的方法。
必要的主题化
因为该操作栏部件非常复杂,它需要一套默认的主题。该库提供三个核心的主题——其中的任何一个都必须被应用到每个你需要操作栏存在的 Activity 上。下一节说明该问题。
引用
为了使用操作栏的功能,必须在 Android 3.0 以上的版本,该库包含并使用的大量的类,与原生 Android 的包名相对应。最常见的是:
- com.actionbarsherlock.app.ActionBar
- com.actionbarsherlock.view.Menu
- com.actionbarsherlock.view.MenuItem
- com.actionbarsherlock.view.MenuInflater
加入这些包才能确保你适当使用这些类型,以及额外的功能。
注意:大多数对于从 activity 的 @Override 方法的错误,都是由于错误地 import 的结果。所有在 com.actionbarsherlock.* 包中类,它们的名字和位置都与原生的类相匹配。例如,com.actionbarsherlock.app.ActionBar 与 com.android.app.ActionBar 相对应。
注意:为了从 XML 文件 inflate 你的菜单,应该在你的 activitie 中调用 getSupportMenuInflater() 方法。fragment 回调会准备 inflater 的一个实例作为参数。最近我就犯了这个错误,eclipse 报了个 inflateException,看到这句话我才明白。
主题化
工作在所有设备上的操作栏的主题化都是非常直接和简单的过程。你应该遵循现存主题化的建议,以便做些小的改动来自定义原生的操作栏。
在“Demos”示例项目里的“Styled”,是一个自定义操作栏的示例。
Parent Themes
为了自定义操作栏,以实现你的应用程序,必须使用 Theme.Sherlock,Theme.Sherlock.Light,或 Theme.Sherlock.Light.DarkActionBar,或是你把上述主题作为父来自定义主题。
主题定义在你的整个应用程序清单中,或是每个 activity。另外,在调用 super.onCreate(Bundle) 之前,你也可以在每个 activity 代码中定义主题。这必须让每个 activity 继承 'Sherlock' activity 基类之一,并可使用操作栏。更多信息如何指定一个主题,在 Android 官方文档可以找到。
Mirrored Attributes
由于Android 主题化系统的限制,任何主题的自定义都必须以两个属性来声明,name 和 parent。正常的“android”为前缀的属性应用到原生的操作栏,没有前缀的是对自定义的。
下面是上面提到的“Styled”示例的一个完整主题:
<style name="Theme.Styled" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
<item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>
<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="background">@drawable/bg_striped</item>
<item name="android:background">@drawable/bg_striped</item>
<item name="backgroundSplit">@drawable/bg_striped_split</item>
<item name="android:backgroundSplit">@drawable/bg_striped_split</item>
</style>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
ActionBarSherlock 演示项目

图 4 Github actionsherlock 项目

图 5 actionbarsherlock 项目 actionbarsherlock-samples 目录
actionsherlock 源代码中包含很多示例:
- Demos
The demo sample is a showcase of the functionality of the library and its action bar. There is an example for nearly every major feature of the library and you should refer to the source code for each activity for the proper way to use each.
- Fragments
This sample is simply the 'API Demos' sample from the Android support library ported to use SherlockFragmentActivity and SherlockFragment. It should provide a good idea of how these two classes are used to replace FragmentActivity and Fragment.
- RoboGuice
A port of one of the RoboGuice sample applications which shows how you can combine two libraries which require the use of base activities.
- Styled
This sample is adapted from a blog post by Nick Butcher which demonstrates how to style various action bar components. While originally targetted at Honeycomb tablets, this sample still provides a good starter for styling.
- Known Bugs
Unlike the others, this sample application's sole purpose it to demonstrate known bugs with the library. These oftentimes will be framework-related which need fixed in Android before they can be fixed in the library.
本文 ActionBarSherlock 简单演示
环境
- Windows 7 64 位
- Eclipse ADT V22.6.2,Android 4.4.2(API 19)
- SAMSUNG GT-I9008L,Android OS 2.2.2
项目结构

图 6 项目结构
简单演示
该演示只是一个使用 ActionBarSherlock 必需设置的简单演示。如图 6 所示。

图 7 本文的简单演示
核心代码如下所示:
MainActivity.java
package com.example.mydemo;
import android.os.Bundle;
import android.widget.Toast;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.SubMenu;
public class MainActivity extends SherlockActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu sub = menu.addSubMenu("Theme");
sub.add(0, R.style.Theme_Sherlock, 0, "Default");
sub.add(0, R.style.Theme_Sherlock_Light, 0, "Light");
sub.add(0, R.style.Theme_Sherlock_Light_DarkActionBar, 0,
"Light (Dark Action Bar)");
sub.getItem().setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS
| MenuItem.SHOW_AS_ACTION_WITH_TEXT);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home || item.getItemId() == 0) {
return false;
}
Toast.makeText(this, "Theme changed to \"" + item.getTitle() + "\"",
Toast.LENGTH_SHORT).show();
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// Used for theme switching in samples
setTheme(R.style.Theme_Sherlock);
// setTheme(R.style.Theme_Sherlock_Light);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mydemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 设置 main.xml 的主题为 Theme.Sherlock -->
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Sherlock" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Android 关于 ActionBarSherlock 的使用的更多相关文章
- android 代码混淆示例
参考其它资料为项目代码做了一下混淆 项目中使用了 slidingmenu actionbarsherlock fastjson volley httpclient 等第三方库, 并使用了 ...
- Android 2.x中使用actionbar - Actionbarsherlock (2)
先前有一个项目,是基于android4.0来开发,使用到了Fragment及ActionBar,没打算支持android2.1-android2.3系列版本 写完之后,我将此应用发布到百度应用,一天以 ...
- Android 2.x中使用actionbar - Actionbarsherlock
1. 范例说明 从Android 3.0开始,Android引入了ActoinBar,不得不说3.0之前android的标题栏确实比较丑,并且还没有任何功能. 之前很多应用的顶部栏很多都是仿苹果的,比 ...
- Android ActionBarSherlock使用教程
Android ActionBarSherlock使用教程 本文转自 http://www.chenwg.com/android/actionbarsherlock%E4%BD%BF%E7%94%A8 ...
- Android 开源框架ActionBarSherlock初探
1:我的开发环境是Ubuntu12.04下:adt-bundle-linux-x86-20130729. ActionBarSherlock下载地址:http://actionbarsherlock. ...
- Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721 大家都知道Android的ActionBar是在3.0以上才有的,那么在3 ...
- Android UI ActionBar功能-ActionBarSherlock 的使用
ActionBarSherlock实现了在ActionBar上添加一个下拉菜单的功能,也是App常用的功能之一: ActionBarSherlock是第三方提供的一个开源类库,下载地址:http:// ...
- android ActionBarSherlock使用说明
源代码地址:https://github.com/JakeWharton/ActionBarSherlock 1.添加项目依赖包 2.修改AndroidManifest.xml中的主题(或者继承该主题 ...
- android项目中导入actionbarsherlock 需要注意的地方
1,在导入actionbarsherlock 这个library时,如果一直报" Invalid Project Description" ; 解决办法: android中li ...
随机推荐
- Client Dataset Basics
文章出处: http://www.informit.com/articles/article.aspx?p=24094 In the preceding two chapters, I discus ...
- iPhone/iPad各种文件路径详解 帮助了解自己的iphone和ipad
以下内容皆为转载分享iPhone里重要的目录路径有哪几个? 1. /private/var/mobile 新刷完的机器,要在这个文件夹下建一个Documents的目录,很多程序都要用到. 2. /pr ...
- Map HashMap 排序 迭代循环 修改值
HashMap dgzhMap = Dict.getDict("dgzh"); Iterator it_d = dgzhMap.entrySet().iterator(); whi ...
- 我们的生活第二季/全集This Is Us迅雷下载
NBC剧集<我们这一天>宣布一次性续订2.3季,这部Dan Fogelman打造的大热剧是这个秋季档收视人数第二的广播网剧情剧.新续订的两季还是每季18集. NBC的叫好叫座剧<我们 ...
- 通用的Bitmap压缩算法,进一步节约内存(推荐)
前几天我写了一篇通过压缩Bitmap,减少OOM的文章,那篇文章的目的是按照imageview的大小来压缩bitmap,让bitmap的大小正好是imageview.但是那种算法的通用性比较差,仅仅能 ...
- Windows Power Shell简介
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能. 它引入了许多非常有用的新概念,从而进一步扩展了您在 W ...
- 转:PHP高效率写法(详解原因)
FROM : http://my.oschina.net/No5stranger/blog/157585#OSC_h3_1 1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4 ...
- [转]pear windows 安装
FROM : http://jingyan.baidu.com/article/ca41422fd8cf3d1eae99ed3e.html 因为想使用phpdocument生成文档,不得不安装pear ...
- 奇怪吸引子---Finance
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- C++ assert 断言使用
在研究corepattern需要让程序出core, 因此用到的assert, 记录一下. 写严谨代码时,也可以使用assert进行严格的条件判断. 函数原型: #include <asser ...

