42

阅读下面的更新 2 以获得答案

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

它现在只是一个骨架活动,它在 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);
}

我一定是错误地设置了主题,但我只是不明白如何。任何人都可以帮忙吗?

UPDATE 下面,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) 接下来,导航到library从 github 签出的 ActionBarSherlock 目录根目录内的文件夹。键入android update project以便为库创建一个build.xmlproguard.cfg文件。

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

4

7 回答 7

75

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

如果您想在您的应用程序中的任何地方使用 ActionBarSherlock,这可行:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock">
于 2012-03-18T11:10:53.463 回答
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" />
于 2012-11-01T15:18:37.863 回答
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 类的链接。

于 2012-07-30T16:50:38.460 回答
1

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

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

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

我的模板中的 Drawable 是通过Android Action Bar Style Generator 生成的。我对资源使用不同的命名约定。这个简单的脚本将使用 Android 操作栏样式生成器生成的所有资源重命名为我自己的约定,在模板中使用。

于 2013-01-16T19:31:28.367 回答
1

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
于 2013-04-17T12:12:43.267 回答
1

这在 IntelliJ IDEA 中发生在我身上。我通过转到文件>项目结构>项目设置>构面>在第二列中选择actionbarsherlock模块>选中“库模块”复选框>应用并确定>保存并重建来解决了这个问题。

更新经过进一步审查,我的原始回复可能过于具体,并且可能仅在某些情况下有效。此错误意味着尚未正确设置依赖项。在 IntelliJ IDEA 中,按照以下步骤将 actionbarsherlock 正确设置为模块依赖项:

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

这应该够了吧。

于 2013-07-24T12:16:18.777 回答
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 文件。我错误地为主要活动指定主题,而不是为整个应用程序指定主题!

于 2013-09-01T23:07:30.937 回答