为Android应用程序设置ActionBarSherlock主题

42

请查看下面的更新2以获取答案

我正在尝试在我的应用程序中使用ActionBarSherlock。我从项目 GitHub 存储库检出了 4.0.0 版本,在 Netbeans 中进行了构建,然后将 library-4.0.0.jar 文件复制到我的项目的 lib 目录中(我没有使用 Eclipse)。

目前只有一个基本骨架 Activity,在 ICS 上可以正常启动,但是当我在 Gingerbread 上运行它时,我会得到以下异常,提示我没有将应用主题设置为 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方法的调用。这个应用程序只包含一个活动,其中有一个onCreate()方法,我在顶部调用setTheme()

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>

但是当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以为库创建一个build.xml文件和一个proguard.cfg文件。

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


请前往ABS的Github下载示例ABS应用程序源代码并查看。 - xDragonZ
那是我检查的第一个地方。在ABS演示应用程序中,SampleList类的静态THEME成员被初始化为R.style.Theme_Sherlock,但除了从选项菜单更改其存储值之外,在该活动中从未使用过。从该主活动启动的所有活动都在其onCreate()方法的顶部调用setTheme()并将该常量作为参数传递,这就是为什么我在我的代码中也这样做的原因。您会注意到相同的指令也列在ABS网站上“父母主题”部分的第二段中。http://actionbarsherlock.com/theming.html - Arash Payan
7个回答

75

通常,你可以像Android开发者文档中所示的那样,在清单文件中设置主题(也链接在ActionBarSherlock主题页面中)。

如果你希望在应用程序的所有位置都使用ActionBarSherlock,则可以这样做:

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

3
确实。在发布之前,我尝试了这个方法,但出现了“/AndroidManifest.xml:7: error: Error: No resource found that matches the given name (at 'theme' with value '@style/Theme.Sherlock')”的错误。我会更新问题以指出这一点。 - Arash Payan
2
@ArashPayan:删除您创建的JAR文件。将ActionBarSherlock添加到您的应用程序中作为Android库项目。虽然ActionBarSherlock文档(请参见“包含在您的项目中”)仅引用了Eclipse和Maven如何执行此操作,但是您应该能够通过遵循Android开发人员文档将其添加为NetBeans中的库项目:http://developer.android.com/guide/developing/projects/projects-cmdline.html#ReferencingLibraryProject - CommonsWare
成功了。我还得移除android-support-v4.jar文件,因为它已经包含在ABS中了。我会概述我所采取的所有步骤。谢谢! - Arash Payan

19

对我来说,这是由于没有使用@style/前缀引起的。也就是说,我有:

For me this was caused by not using the @style/ prefix. I.e. I had
<style name="AppTheme" parent="Theme.Sherlock.Light" />

取代

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

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

<style name="AppTheme" parent="android:Theme.Holo.Light" />

刚刚遇到了这个问题,感谢你的答案。明显浪费了太多时间尝试其他方法。 - Mike P.

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

提示是使用类型 "apklib",这意味着Maven将使用所有源代码(包括资源)。在编码过程中,使用其他依赖项链接到Sherlock类的jar文件(scope "provided")。


1
如果您想使用自定义样式,我制作了一个自定义ActionBarSherlock样式模板。主题在/values/styles.xml文件中定义。它是从Theme.Sherlock.Light主题扩展而来的。有许多参数可以设置:图标、徽标、分隔符、标题、阴影叠加、操作菜单按钮、弹出菜单、操作模式背景、下拉列表导航、选项卡样式、显示选项等。几乎所有你需要创建自定义操作栏主题的东西都在这里了。我在我的应用程序中使用这个模板,因为它帮助我快速地为操作栏设置样式。
您可以在我的GitHub上找到这个模板。它非常容易使用。只需将值和可绘制目录复制到您的项目中,并在AndroidManifest.xml中的应用程序元素中设置android:theme参数即可。
<application
    ...
    android:theme="@style/Theme.Example">

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

1
这种情况发生在我使用IntelliJ IDEA时。我通过进入“文件”→“项目结构设置”→“模块”→“选择actionbarsherlock模块”→在第二列中选中“库模块”复选框→点击应用和确定按钮→保存并重新构建来解决了这个问题。 更新:经过进一步的审查,我的原始回答可能太具体化,只适用于特定情况。这个错误意味着依赖项没有被正确设置。在IntelliJ IDEA中,按照以下步骤正确设置actionbarsherlock作为模块依赖项:
  1. 从zip文件中下载并提取actionbarsherlock库(注意:您只需要“actionbarsherlock”文件夹)
  2. 将其复制并粘贴到您的Android项目旁边
  3. 在IntelliJ中打开您的项目
  4. 文件>项目结构>项目设置>模块>添加(第二列上方的绿色“+”)>导入模块>在文件浏览器对话框中选择actionbarsherlock目录>确定>从现有源代码创建模块>下一步
  5. 取消选中“test”文件夹,以便它不会添加到项目中,并单击“下一步”
  6. 在“库”选项卡下,应该勾选android-support-v4,然后单击“下一步”
  7. 在“模块”选项卡下,应该勾选actionbarsherlock,然后单击“下一步”
  8. 如果它要求您覆盖actionbarsherlock.iml,请选择“覆盖”,然后选择“完成”(您应该返回到项目结构对话框的“模块”部分)
  9. 从第二列中选择actionbarsherlock模块,在第三列的“依赖项”选项卡下,勾选android-support-v4库旁边的“导出”
  10. 快要完成了!
  11. 现在从第二列中选择您的项目模块,在“依赖项”选项卡下,单击添加按钮(对话框最右侧的绿色“+”)
  12. 选择模块依赖项,然后从弹出的对话框中选择actionbarsherlock并按“确定”
  13. 现在单击“应用”或“确定”以接受更改
那应该就可以了。

1

我曾经遇到过同样的问题。尽管在清单文件中设置了主题,但应用程序仍然崩溃。通过编程方式设置主题解决了这个问题:

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

就此而言,该答案也被推荐在这个线程https://dev59.com/2GnWa4cB1Zd3GeqP1ogN上,但ActionBarSherlock的作者Jake Wharton在评论中写道,该答案是错误的。 - RenniePet

0

这不是对楼主问题的回答,但我想描述一下我如何获得与他提到的相同异常,希望能帮助其他人:

    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.

在我的情况下,解决方案非常简单,但我花了太长时间才找到它。所有关于这个异常的文章都说“检查您是否在manifest.xml文件中指定了主题”,所以我快速查看了一下我的manifest.xml文件,发现已经指定了主题。然后我尝试了各种其他方法。
最后,我仔细查看了我的manifest.xml文件。我犯了一个错误,为主Activity指定了主题,而不是整个应用程序!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接