为Android应用程序设置ActionBarSherlock主题

阅读下面的答案更新2

我试图在我的应用程序中使用ActionBarSherlock。 我从github项目中检出4.0.0版本,在Netbeans中构build它,然后将库4.0.0.jar文件复制到我的项目的lib目录中(我没有使用Eclipse)。

这只是一个骨干活动,现在它在ICS中启动,但是当我在姜饼上运行时,我得到以下exception抱怨我没有Theme.Sherlock(或类似)的应用程序主题:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arashpayan.prayerbook/com.arashpayan.prayerbook.PrayerBook}: java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative. at com.actionbarsherlock.internal.ActionBarSherlockCompat.generateLayout(ActionBarSherlockCompat.java:987) at com.actionbarsherlock.internal.ActionBarSherlockCompat.installDecor(ActionBarSherlockCompat.java:899) at com.actionbarsherlock.internal.ActionBarSherlockCompat.setContentView(ActionBarSherlockCompat.java:852) at com.actionbarsherlock.ActionBarSherlock.setContentView(ActionBarSherlock.java:655) at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.java:316) at com.arashpayan.prayerbook.PrayerBook.onCreate(PrayerBook.java:44) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) ... 11 more 

它抱怨的线(PrayerBook:44)是对setContentView的调用。 该应用程序只包含一个单一的活动,我从上面调用setTheme()方法的onCreate()方法:

 public void onCreate(Bundle savedInstanceState) { setTheme(com.actionbarsherlock.R.style.Theme_Sherlock); super.onCreate(savedInstanceState); TextView rootTextView = new TextView(this); rootTextView.setText("Hello, world!"); setContentView(rootTextView); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab = getSupportActionBar().newTab(); tab.setText("Prayers"); getSupportActionBar().addTab(tab); tab = getSupportActionBar().newTab(); tab.setText("Recents"); getSupportActionBar().addTab(tab); tab = getSupportActionBar().newTab(); tab.setText("Bookmarks"); getSupportActionBar().addTab(tab); } 

我必须错误地设置主题,但我不知道如何。 谁能帮忙?

更新下面,CommonsWare指出,主题可以在AndroidManifest.xml中设置。 我试过这样的:

 <application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@style/Theme.Sherlock"> <activity android:name="PrayerBook" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden|screenLayout|uiMode|mcc|mnc|locale|navigation|fontScale|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="LanguagesActivity" /> </application> 

但是当它尝试构build应用程序时,Ant给了我一个错误:

 /Users/arash/coding/prayerbook/AndroidManifest.xml:7: error: Error: No resource found that matches the given name (at 'theme' with value '@style/Theme.Sherlock'). 

更新2随着CommonsWare的帮助,他的后续评论,我能够得到它的工作。 我需要添加ActionBarSherlock作为项目依赖。 为此,

1)我从我的项目的lib目录中删除了library-4.0.0.jarandroid-support-4.0.jar

2)接下来,导航到从github签出的ActionBarSherlock目录的根目录下的library文件夹。 键入android update project以便为库创buildbuild.xmlproguard.cfg文件。

3)最后,回到主项目目录,并使用android update project --path . --library ../ActionBarSherlock/library添加ABS作为库依赖android update project --path . --library ../ActionBarSherlock/library android update project --path . --library ../ActionBarSherlock/library命令中android update project --path . --library ../ActionBarSherlock/library的path将根据您检出回购的位置而有所不同。 ActionBarSherlock和我的应用程序的项目目录是兄弟目录。

通常,您在清单中设置主题,如Android开发人员文档所示 (并链接到ActionBarSherlock主题页面 )。

如果你想在你的应用程序的任何地方使用ActionBarSherlock,这个工作:

 <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.Sherlock"> 

对我来说,这是由于没有使用@style/前缀。 即我有

 <style name="AppTheme" parent="Theme.Sherlock.Light" /> 

代替

 <style name="AppTheme" parent="@style/Theme.Sherlock.Light" /> 

这是有点怪异的,因为我发誓默认的模板值是这样的:

 <style name="AppTheme" parent="android:Theme.Holo.Light" /> 
 <!--Provides resources--> <dependency> <groupId>com.actionbarsherlock</groupId> <artifactId>library</artifactId> <version>4.1.0</version> <type>apklib</type> </dependency> <!-Provides import links--> <dependency> <groupId>com.actionbarsherlock</groupId> <artifactId>library</artifactId> <version>4.1.0</version> <type>jar</type> <scope>provided</scope> </dependency> 

提示是使用types“apklib”,这意味着maven将使用所有的来源(资源)。 对jar文件的其他依赖(范围“提供”)用于在编码期间实现与sherlock类的链接。

有同样的问题。 应用程序崩溃,尽pipe主题是在清单中设置的。 以编程方式设置主题解决了问题:

 @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); 

这在IntelliJ IDEA中发生在我身上。 通过转到文件>项目结构>项目设置>构面>select第二栏中的actionbarsherlock模块>检查“库模块”checkbox>应用并确定>保存并重新构build,从而解决了此问题。

更新经过进一步的审查,我的原始答复可能太具体,并可能只在某些情况下工作。 此错误意味着依赖关系没有正确设置。 在IntelliJ IDEA中,按照以下步骤正确设置actionbarsherlock作为模块依赖项:

  1. 从zip下载并提取actionbarsherlock库(注意:您只需要“actionbarsherlock”文件夹)
  2. 将其复制并粘贴到您的Android项目中
  3. 在IntelliJ中打开您的项目
  4. 文件>项目结构>项目设置>模块>添加(在第二列上方的绿色“+”)>导入模块>在文件浏览器对话框中selectactionbarsherlock目录>确定>从现有源创build模块>下一步
  5. 取消选中“test”文件夹,使其不被添加到项目中,然后点击“下一步”
  6. 在Libraries选项卡下,应该选中android-support-v4,点击“Next”
  7. 在Modules选项卡下,应该检查actionbarsherlock,点击“Next”
  8. 如果要求你覆盖actionbarsherlock.iml,select“覆盖”,然后“完成”(你应该返回到“项目结构”对话框的“模块”部分)
  9. 从第二列中selectactionbarsherlock模块,并在第三列的Dependencies选项卡下,选中android-support-v4库旁边的“Export”
  10. 差不多了!
  11. 现在从第二列中select您的项目模块,然后在Dependencies选项卡下,单击Addbutton(对话框最右侧的绿色“+”),
  12. selectModule Dependency并从popup的对话框中selectactionbarsherlock,然后按“OK”
  13. 现在点击“应用”或“确定”接受更改

这应该够了吧。

如果你想使用自定义样式,我为自定义的ActionBarSherlock风格做了一个模板 。 主题是在/values/styles.xml文件中定义的。 它从Theme.Sherlock.Light主题扩展而来。 有很多参数,你可以设置:图标,标志,分隔线,标题,阴影叠加,动作菜单button,popup菜单,动作模式背景,下拉列表导航,标签样式,显示选项等几乎所有的东西,你需要创build您的自定义操作栏主题。 我在我的应用程序中使用此模板,因为它可以帮助我快速设置操作栏的样式。

你可以在我的GitHub上find这个模板。 这是非常容易使用。 只需将值和可绘制的directsor复制到您的项目中,并在AndroidManifest.xml的应用程序元素中设置android:theme参数:

 <application ... android:theme="@style/Theme.Example"> 

我的模板中的Drawables是通过Android Action Bar Style Generator生成的 。 我使用不同的资源命名约定。 这个简单的脚本将使用Android Action Bar Style Generator生成的所有资源重命名为我自己的惯例,在模板中使用。

这不是OP问题的答案,但我只是描述了我如何设法得到与他所提到的相同的exception,希望能帮助别人:

  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Merlinia.MMessaging_Test/com.Merlinia.MMessaging_Test.TestObjectsActivity}: java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative. 

就我而言,解决scheme非常简单,虽然我花了很长时间才find它。 你所读到的关于这个exception的一切都是“检查你在manifest.xml文件中指定了主题”,所以我快速浏览了我的manifest.xml文件。 所以我尝试了各种其他的东西。

最后,我仔细看看我的manifest.xml文件。 我犯了主要活动的主题错误,而不是整个应用程序!