2012-03-18 33 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文件。我犯了主要活動主題的錯誤,而不是整個應用程序!

相關問題