【问题标题】:Setting ActionBarSherlock Theme for Android app为 Android 应用设置 ActionBarSherlock 主题
【发布时间】:2012-04-03 04:25:48
【问题描述】:

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

我正在尝试在我的应用中使用 ActionBarSherlock。我从project 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);
}

我一定是错误地设置了主题,但我就是不明白怎么做。有人可以帮忙吗?

更新 下面,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 在他的后续 cmets 中的帮助下,我能够让它工作。我需要将 ActionBarSherlock 添加为项目依赖项。为此,

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

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

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

【问题讨论】:

  • 去ABS github下载示例ABS应用源码看看
  • 这是我检查的第一个地方。在 ABS 演示应用程序中,SampleList 类的静态 THEME 成员被初始化为 R.style.Theme_Sherlock 但从未在该活动中使用,除非从选项菜单更改它的存储值。所有活动都从该主要活动调用 setTheme() 开始,该常量作为 onCreate() 方法最顶部的参数,这就是我在代码中执行相同操作的原因。您会注意到 ABS 网站上“父主题”部分的第二段中也列出了相同的说明。 actionbarsherlock.com/theming.html

标签: android actionbarsherlock


【解决方案1】:

通常,您在清单中设置主题,如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">

【讨论】:

  • 确实如此。我在发布之前尝试了那个东西,但我得到了 /AndroidManifest.xml:7: error: Error: No resource found that match the given name (at 'theme' with value '@style/Theme.Sherlock')。我会更新问题以指出这一点。
  • @ArashPayan:删除您创建的 JAR。将 ActionBarSherlock 作为 Android 库项目添加到您的应用中。虽然the ActionBarSherlock documentation(请参阅“包含在您的项目中”)仅引用 Eclipse 和 Maven 来说明如何执行此操作,但您应该能够按照 Android 开发人员文档将其添加为 NetBeans 中的库项目:developer.android.com/guide/developing/projects/…
  • 成功了。我还必须删除 android-support-v4.jar 文件,因为它包含在 ABS 中。我将概述我在上面采取的所有步骤。谢谢!
【解决方案2】:

对我来说,这是由于没有使用 @style/ 前缀造成的。 IE。我有

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

而不是

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

这有点奇怪,因为我发誓默认模板值类似于:

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

【讨论】:

  • 刚碰到这个,谢谢你的回答。肯定浪费了太多时间尝试其他事情。
【解决方案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 类的链接。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    【解决方案5】:

    这在 IntelliJ IDEA 中发生在我身上。我通过转到 File > Project Structure > Project Settings > Facets > Select actionbarsherlock module in 2nd column > 检查“Library module”复选框 > Apply and OK > Save and Rebuild 解决了这个问题。

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

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

    这应该可以解决问题。

    【讨论】:

      【解决方案6】:

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

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

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          • 2021-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多