2012-03-18 34 views
42

,读取,更新2下面的答案设置ActionBarSherlock的主题为Android应用

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

这只是一个骨架活动,现在它在ICS中启动得很好,但是当我在姜饼上运行它时,我得到以下异常,抱怨我没有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 

它抱怨的线(祈祷书: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> 

但蚂蚁给我一个错误:

/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.xmlproguard.cfg文件。

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

+0

去ABS github下载示例ABS应用程序的源代码,并看看 – xDragonZ 2012-03-18 10:39:51

+0

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

回答

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"> 
+3

确实。在发布之前我尝试了这件事,但是我得到/AndroidManifest.xml:7:错误:错误:找不到与给定名称匹配的资源(在'主题'中使用值'@ style/Theme.Sherlock')。我会更新问题以指出这一点。 – 2012-03-18 11:23:01

+2

@ArashPayan:删除您创建的JAR。将ActionBarSherlock作为Android库项目添加到您的应用中。虽然[ActionBarSherlock文档](http://actionbarsherlock.com/usage.html)(请参阅“包含在您的项目中”)仅引用Eclipse和Maven以了解如何执行此操作,但您应该可以将其添加为库项目在NetBeans中遵循Android开发人员文档:http://developer.android.com/guide/developing/projects/projects-cmdline.html#ReferencingLibraryProject – CommonsWare 2012-03-18 11:28:41

+0

这样做的窍门。我不得不删除android-support-v4.jar文件,因为它包含在ABS中。我将概述上述所有步骤。谢谢! – 2012-03-18 11:53:21

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类的链接。

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" /> 
+0

刚碰到这个,谢谢你的回答。绝对浪费太多时间尝试其他事情。 – 2013-03-30 01:23:41

+0

成就了我的一天,谢谢! – GabrielWeis 2013-12-09 08:54:47

1

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

您可以在我的GitHub上找到此模板。这是非常容易使用。只需复制值和绘制directiories到您的项目,并设置机器人:在应用元素主题参数AndroidManifest.xml

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

可绘制在我的模板是通过Android Action Bar Style Generator产生。我对资源使用不同的命名约定。 This simple script将使用Android Action Bar Style Generator生成的所有资源重命名为我自己的约定,并在模板中使用。

1

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

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

对于什么是值得的,这个答案也建议在这个线程http://stackoverflow.com/questions/12864298/java-lang-runtimeexception-theme-sherlock,但杰克沃顿,ActionBarSherlock的作者,在评论中写道答案是错的。 – RenniePet 2013-09-01 22:56:37

1

IntelliJ IDEA中发生了这种情况。通过转至文件>项目结构>项目设置>构面>选择第二列中的actionbarsherlock模块>检查“库模块”复选框>应用并确定>保存并重新构建,从而解决了此问题。

UPDATE经过进一步的审查,我的原始回复可能太具体,可能只适用于某些情况。此错误意味着依赖关系尚未正确设置。在IntelliJ IDEA的,请按照下列步骤正确设置actionbarsherlock作为一个模块依赖:

  1. 下载并从zip提取actionbarsherlock库(注意:您只需要“actionbarsherlock”文件夹)
  2. 复制和粘贴文件>项目结构>项目设置>模块>添加(在第二列上方绿色'+')>导入模块>在文件浏览器对话框中选择actionbarsherlock目录>确定>创建来自现有来源的模块>下一个
  3. 取消选中“测试”文件夹,以便它不会被添加到项目,然后单击“下一步”
  4. 在Libraries选项卡中,Android的支持-V4应进行检查,然后单击“下一步”
  5. 在模块选项卡,点击“下一步”
  6. 如果它要求你覆盖actionbarsherlock.iml,选择“覆盖”,然后“完成”(你应该返回到项目结构对话框的模块部分)
  7. 选择第二列中的actionbarsherlock模块以及第三列中的Dependencies选项卡下,选中android-support-v4库旁边的“Export”
  8. 几乎在那里!
  9. 现在,从第二列中选择您的项目模块,以及依赖选项卡下,单击Add按钮(绿色“+”在对话框的最右边)
  10. 选择模块依赖关系,然后从对话框actionbarsherlock那弹出,然后按“确定”
  11. 现在点击“应用”或“确定”接受更改

这应该做的伎俩。

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

相关问题