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>
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>