为Android应用设置ActionBarSherlock主题

时间:2012-03-18 09:54:20

标签: android actionbarsherlock

阅读更新下面的答案

我正在尝试在我的应用中使用ActionBarSherlock。我查看了project github repo中的4.0.0版本,在Netbeans中构建了它,然后将library-4.0.0.jar文件复制到我项目的lib目录中(我没有使用Eclipse)。

它现在只是一个骨架活动,它在ICS中启动得很好,但是当我在Gingerbread上运行时,我得到以下异常抱怨我没有Theme.Sherlock(或类似)的应用主题:< / p>

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)我从项目的library-4.0.0.jar目录中删除了android-support-4.0.jarlib

2)接下来,导航到从github检出的ActionBarSherlock目录根目录中的library文件夹。输入android update project,以便为该库创建build.xmlproguard.cfg文件。

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

7 个答案:

答案 0 :(得分:75)

通常,您在清单中设置主题,如the Android developer documentation所示(并链接到the ActionBarSherlock theming page)。

如果您想在应用中的任何位置使用ActionBarSherlock,则可以使用:

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

答案 1 :(得分:19)

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

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

而不是

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

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

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

答案 2 :(得分: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将使用所有源(资源)。 jar文件的其他依赖(范围“提供”)用于在编码期间实现与sherlock类的链接。

答案 3 :(得分:1)

如果您想使用自定义样式,我创建了 template for custom ActionBarSherlock style 。主题在/values/styles.xml文件中定义。它从Theme.Sherlock.Light主题扩展而来。有很多参数,你可以设置:图标,标识,分隔符,标题,阴影叠加,动作菜单按钮,弹出菜单,动作模式背景,下拉列表导航,标签样式,显示选项等。几乎一切,你是什么需要,创建自定义操作栏主题。我在我的应用程序中使用此模板,因为它可以帮助我快速设置操作栏的样式。

您可以在GitHub上找到此模板。这是非常容易使用。只需将值和drawable directiories复制到项目中,并在AndroidManifest.xml中的application元素中设置android:theme参数:

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

我的模板中的Drawables是通过Android Action Bar Style Generator生成的。我对资源使用不同的命名约定。 This simple script将使用Android操作栏样式生成器生成的所有资源重命名为我在模板中使用的约定。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

在IntelliJ IDEA中发生了这种情况。我通过转到文件&gt;解决了这个问题。项目结构&gt;项目设置&gt;方面&gt;在第二列中选择actionbarsherlock模块&gt;选中“库模块”复选框&gt;申请并确认&gt;保存并重建。

更新经过进一步审核后,我原来的回复可能过于具体,可能仅适用于某些情况。此错误表示尚未正确设置依赖项。在IntelliJ IDEA中,请按照以下步骤将actionbarsherlock正确设置为模块依赖项:

  1. 从zip下载并解压缩actionbarsherlock库(注意:您只需要“actionbarsherlock”文件夹)
  2. 将其与Android项目一起复制并粘贴
  3. 在IntelliJ中打开您的项目
  4. 文件&gt;项目结构&gt;项目设置&gt;模块&gt;添加(第二列上方的绿色'+')&gt;导入模块&gt;在文件浏览器对话框中选择actionbarsherlock目录&gt;好的&gt;从现有来源创建模块&gt;下一步
  5. 取消选中“test”文件夹,使其不会添加到项目中,然后点击“下一步”
  6. 在Libraries选项卡下,应检查android-support-v4,单击“Next”
  7. 在“模块”选项卡下,应选中actionbarsherlock,然后单击“下一步”
  8. 如果它要求您覆盖actionbarsherlock.iml,请选择“覆盖”然后“完成”(您应该返回到“项目结构”对话框的“模块”部分)
  9. 从第二列中选择actionbarsherlock模块,在第三列的Dependencies选项卡下,选中android-support-v4库旁边的“Export”
  10. 几乎就在那里!
  11. 现在从第二列中选择您的项目模块,然后在Dependencies选项卡下,单击Add按钮(对话框最右侧的绿色'+')
  12. 选择Module Dependency并从弹出的对话框中选择actionbarsherlock,然后按“OK”
  13. 现在点击“应用”或“确定”接受更改
  14. 这应该可以解决问题。

答案 6 :(得分:0)

这不是OP的问题的答案,但我只是描述我如何设法得到他提到的相同的例外,希望它可以帮助其他人:

    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文件。我错误地指定了主要活动的主题,而不是整个应用程序!