ActionBarSherlock在github上的地址是:https://github.com/JakeWharton/ActionBarSherlock,它的官网是:http://actionbarsherlock.com/,下载即可,现在最新版本是4.2.0.

下载好,就解压出来,有三个文件夹,其实library就是Android公共库的使用,也就是将一些共同的东西抽取出来,包括java文件,资源文件等。

我的开发工具是eclipse,并安装了Android-maven,然后将这个library项目以maven项目导入即可。

接着新建一个Android工程,然后右键选择properties,再选择Android,接着添加library进来,如下:

actionbar1 ActionBarSherlock使用教程

1.修改项目的AndroidManifest.xml文件,将Android的Theme,也就主题改为如下:

android:theme=”@style/Theme.Sherlock.Light”  ,也就是使用ActionBarSherlock里的主题;

2.修改MainActivity.java文件,默认生成的MainActivity类是继承Activity的,现在将Activity修改成SherlockActivity;

3.修改menu文件夹下的main.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<menuxmlns:android="http://schemas.android.com/apk/res/android">
 
    <item
        android:id="@+id/add"
        android:icon="@android:drawable/ic_menu_add"
        android:showAsAction="ifRoom"
        android:title="@string/add"
        android:titleCondensed="@string/add">
    </item>
    <item
        android:id="@+id/delete"
        android:icon="@android:drawable/ic_menu_delete"
        android:showAsAction="ifRoom"
        android:title="@string/delete"
        android:titleCondensed="@string/delete">
    </item>
 
</menu>

4.要使ActionBar显示menu按钮,得重写MainActivity中的onCreateOptionsMenu方法,还要导入ActionBarSherlock中的Menu、MenuItem包,如下:

1
2
3
4
5
6
7
importcom.actionbarsherlock.view.Menu;
importcom.actionbarsherlock.view.MenuItem;
@Override
    publicboolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);
        returntrue;
    }

Action Bar API

为了创建一个适用于多版本的action bar,要声明activity继承于‘Sjerlock’(eg,  SherlockActivity, SherlockFragmentActivity)。获取action bar的方法是getSupportActionBar()而不来替换getActionbar()。

注意:当用到SherlockfragmentActivity时,‘Sherlock’为前缀的fragment类(eg,SherlockFragment,SherlockListFragment)应该被推荐使用。当然如果不涉及到menu相关的方法,普通的fragment类也是可以的。


在3.0以前的系统上使用ActionBar需要导入下面的类:

com.actionbarsherlock.app.ActionBar
com.actionbarsherlock.view.Menu
com.actionbarsherlock.view.MenuItem
com.actionbarsherlock.view.MenuInflater

多数的错误是因为import出错,以为com.actionbarsherlock.app.*包中的类名和原始SDK中的是一致的。


至于Themes,是可以通过values,values-v11,values-v14等来分版本对待。


下面是个简单的代码片段:

[java] view plaincopy
  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     setTheme(SampleList.THEME); //Used for theme switching in samples  
  4.     super.onCreate(savedInstanceState);  
  5.     setContentView(R.layout.text);  
  6.     ((TextView)findViewById(R.id.text)).setText(R.string.action_providers_content);  
  7. }  
  8.   
  9. /** 
  10.  * {@inheritDoc} 
  11.  */  
  12. @Override  
  13. public boolean onCreateOptionsMenu(Menu menu) {  
  14.     super.onCreateOptionsMenu(menu);  
  15.     getSupportMenuInflater().inflate(R.menu.settings_action_provider, menu);  
  16.     return true;  
  17. }  
  18.   
  19. /** 
  20.  * {@inheritDoc} 
  21.  */  
  22. @Override  
  23. public boolean onOptionsItemSelected(MenuItem item) {  
  24.     // If this callback does not handle the item click, onPerformDefaultAction  
  25.     // of the ActionProvider is invoked. Hence, the provider encapsulates the  
  26.     // complete functionality of the menu item.  
  27.     Toast.makeText(this"Handling in onOptionsItemSelected avoided",  
  28.             Toast.LENGTH_SHORT).show();  
  29.     return false;  
  30. }  


注意事项:

1.自己的项目Buildtarget也要在4.0+,api 14+。不然有关Theme.Holo  xml文件读取不到资源,会导致R文件不能生成。
2.由于actionbarsherlock中自带了android_support_v4的包,所以你不用再导入一个了,以前导入过了也要删除,不然会产生冲突。
3.有时候会提示你的程序不是一个库的错误,只要在ActionbarSherlock中  properties-> android 中,将islibrary勾上就行了。
4.要使用Actionbar要继承sherlockactivity,在配置文件中声明activity时,要添加Theme设置才行,而且只能是三种或parent是这三种。

1、SlidingMenu 的demo工程引用了ActionBarSherlock 里的Threme和style,所以要把后者的libary添加到前者的工程中;否则前者的style.xml文件和AndroidManifest.xml都会报错,大致如下:

Theme.Sherlock.Light.DarkActionBar无法找到

No resource found that matches the given name: attr 'homeAsUpIndicator'.

No resource found that matches the given name 'Theme.Sherlock.Light.DarkActionBar'.

原因是它本身又引用了另外一个开源库 ActionBarSherlock ,所以首先要做的就是去下载 ActionBarSherlock,引用其中的library。

2、 这样,SlidingMenu 的示例代码就引用了两个library,这时候还不能用,项目报错:

Jar mismatch! Fix your dependencies

解决此问题的方法,其实就是需要两个library使用的support包是一样的。

3、 解决了上面的问题之后,还会出现下面的问题:

可能报找不到getSupportActionBar等ActionBarSherLock的方法。原因是使用ActionBarSherLock的Activity需继承于SherlockActivity,修改SlidingMenu library中的SlidingFragmentActivity,让它继承于SherlockFragmentActivity,重新编译library导入。

剩下的工作,就是你自己好好参考实例和文档,研究如何使用了。


导入库后

需要在styles.xml更改主题为(一定要记得改 否则启动时会FC)

[html]

1
2
<!-- 这个是黑色主题 --> 
<style name="AppBaseTheme" parent="Theme.AppCompat">

[html]

1
2
<!-- 这个是白色主题 --> 
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">

[html]

1
2
<!-- 这个是白色主题带黑色ActionBar --> 
<style name="AppBaseTheme"parent="Theme.AppCompat.Light.DarkActionBar">

下面是代码示例(注意是public class XXXActivity extends ActionBarActivity,而不是extends Activity):