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 ...
随机推荐
- Android WebView加载Html右边空白问题的解决方案
用WebView显示Html时,右边会出现一条空白区,如下图所示: 最开始的时候,认为是网页本身的空白. 后来发现网页本身无问题,且这个空白区是跟Scroll Bar 的位置和粗细比较相符,于是去控制 ...
- linux下的c++filt 命令
我们知道, 在C++中, 是允许函数重载的, 也就引出了编译器的name mangling机制, 今天我们要介绍的c++filt命令便与此有关. 对于从事linux开发的人来说, 不可不知道c++fi ...
- discuz修改太阳,月亮,星星等级图标
想必大家都想修改一下默认的等级图标吧,刚才在论坛上看见很多大神的方法都是要修改文件的,不过为了安全起见需要事先备份好才改,这种方法是可行的,但可能有些新手站长不会修改,又或者改错了恢复不来,现在我教大 ...
- delphi shr和shl的作用
x:=x shl 1 二进制数向左移1位,尾部补1个零,相当于x:=x*2;x:=x shl 2 二进制数向左移2位,尾部补2个零,相当于x:=x*4;...x:=x shl n 二进制数向左移n位, ...
- JavaScript学习总结(十五)——Function类
在JavaScript中,函数其实是对象,每个函数都是Function类的实例,既然函数对象,那么就具有自己的属性和方法,因此,函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 一.函数的 ...
- AngularJS的增删改查、state嵌套案例,不涉及服务端
本篇实践一个案例,大致是:左边有导航菜单,右边显示列表,并可对列表项编辑或删除,也可添加新的列表项.借此,可体会到:如何组织可扩展的AngualrJS文件结构,如何点击左侧菜单项右侧显示相应内容,an ...
- SQL Where in list 问题
不过,这种做法有两个缺陷1.Oracle In列表的数目有限制(1000)2.不能复用执行计划,每次几乎都是硬解析.3.In拼接可能存在SQL注入的风险
- SpringUtils
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...
- 使用断言NSAssert()调试程序错误
NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异 ...
- 【k8s】基础概念 + 工作原理
工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...

