2012-07-08 61 views
3

我想按照dev documentaion的編程方式添加動作欄,但是我遇到了一個錯誤。我minSdk設置爲11,我的應用程序有一個佈局和一個活動,並在活動中唯一的代碼是:添加一個動作欄到Theme.Black.NoTitleBar Android

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.inbox); 
    ActionBar actionBar = getActionBar(); 
    actionBar.show(); 

} 

如果我拿出最後兩行,然後我的應用程序運行。我知道holo主題自動包含了動作條,但我不喜歡editText的意見。任何想法,爲什麼發生這種情況。我是否應該使用HoloTheme並以不同的方式主題化視圖?

同樣,我在日食中沒有發現任何錯誤。我的程序崩潰了,我可以從logcat解密爲空指針異常。

回答

12

從文檔鏈接到您:

如果你有一個自定義的活動主題中,你想刪除的動作吧,android:windowActionBar樣式屬性設置爲false。但是,如果使用主題刪除操作欄,則該窗口根本不會允許操作欄,因此您不能稍後添加它 - 呼叫getActionBar()將返回null

由於您使用的主題沒有行動起來吧,getACtionBar()正在恢復null,然後你試圖調用show()null,導致拋出異常。

這樣可以解釋你遇到的錯誤。至於該怎麼辦呢,documentation for ActionBar說:

採用Android 3.0(API級別11)開始,操作欄出現在活動窗口的頂部活動時將使用系統的全息主題(或它的後代主題之一),這是默認的。否則,您可以通過調用requestFeature(FEATURE_ACTION_BAR)或使用windowActionBar屬性在自定義主題中聲明它來添加操作欄。

這給你兩個簡單的選項,讓一個ActionBar不使用Holo主題。這可能是最簡單的,你的情況:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); // Add this line 
    setContentView(R.layout.inbox); 
    ActionBar actionBar = getActionBar(); 
    actionBar.show(); 
} 

更新:你也應該切換到剛Theme.Black沒有NoTitleBar部分,作爲防止動作條的工作。

+0

所以我必須將actionBar添加到主題本身?感謝您解釋錯誤 – EGHDK 2012-07-08 01:19:47

+0

@EGHDK我剛剛更新了我的答案,以解釋「該怎麼做」部分。 – 2012-07-08 01:24:20

+0

仍然崩潰我的應用程序。似乎仍然在logcat中獲得nullPointer。 – EGHDK 2012-07-08 01:28:08

7

什麼噶大山說...有點

要走遠一點我想看看ActionBarSherlock,結合支持庫,那麼你可以添加動作欄幾乎任何Android的版本是2 。X +

爲了讓你從一個創造自己的主題,全屏/沒有標題欄的ABS主題的類似

<style name="Theme.MY.Sherlock.Fullscreen" parent="Theme.Sherlock.Light.DarkActionBar"> 
     <item name="android:windowFullscreen">true</item>; 
</style> 

應用在你的onCreate這一主題,然後讓操作欄中顯示爲相同的(除非你將使用ABS的支持前綴)所以基本上

setTheme(R.style.Theme_MY_Sherlock_Fullscreen); 
setContentView(R.layout.mylayout); 
getSupportActionBar.Show(); 

我假設你可以爲一個標準動作欄做同樣的(使用全息主題爲基地),因爲ABS是相當多的重複功能明智(和許多來源,ABS主要是一個包裝類)它甚至檢測,然後使用本機實施14和更高(11和中間有一些缺少的功能/修復)

你可以看看ABS here,它看起來像他只是更新它JB

- 在值下你的資源文件夾中創建的themes.xml文件(/res/values/themes.xml)

然後把這個在那裏,給上述一試,當然在setTheme的(用Theme_My_Holo_FullScreen替換名稱,不要使用getSupportActionbar()。前綴,我從來不打擾使用本機實現,但它應該工作相同。

<?xml version="1.0" encoding="utf-8"?> 

<resources> 

    <style name="Theme.My.Holo.Fullscreen" parent="Theme.Holo"> 
     <item name="android:windowFullscreen">true</item>; 
    </style> 

</resources> 
+0

是的,我計劃在稍後實施ABS,但是我對如何不能在API lvl 11及更高版本中使用'Theme.Black.noTitleBar'實施操作欄時感到慌亂。儘管如此,我仍然在學習樣式,所以你做的第一個代碼評論對我來說沒有意義=)風格標籤去哪裏? – EGHDK 2012-07-08 01:45:02

+0

樣式進入/res/values/themes.xml我將放在上面的整個文件片段 - 待機 – Idistic 2012-07-08 01:47:13

+0

謝謝。這會在很多時候幫助我。我很感激。 – EGHDK 2012-07-08 01:48:27

10

我遇到了同樣的問題。我終於想出了一個合理的解決方案。我有一個min api版本8,目標api爲11.我不喜歡holo樣式,所以我重寫了以下樣式:

首先,您必須創建一個「res/values-v11」夾。你可能已經有了一個「values」文件夾,只需在同一級別創建一個「values-v11」(無論你的目標API級別是什麼......總是使用「values-v11」)。

創建完成後,您將在每個文件夾中創建一個包含主題的XML文檔。原始值文件夾將用於比android 3.0更低的任何內容(< api 11)。你的主題看起來像這樣。我不是用河洛主題,而是使用Theme.Black.NoTitleBar主題爲母體

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 

    <style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar"> 
     <item name="android:windowNoTitle">True</item> 
     <item name="android:windowActionBar">False</item> 
    </style> 

    <style name="OptionalVisibility"> 
     <item name="android:visibility">visible</item> 
    </style> 

</resources> 

通知。從那裏,我設置了隱藏窗口標題和動作欄的選項,以低於api 11.

然後,我在「values-v11」文件夾中創建第二個主題文檔,並將其設置爲:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 

    <style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar"> 
     <item name="android:windowNoTitle">false</item> 
     <item name="android:windowActionBar">true</item> 
     <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar</item> 
    </style> 

    <style name="OptionalVisibility"> 
     <item name="android:visibility">invisible</item> 
     <item name="android:height">1dp</item> 
    </style> 

</resources> 

在上面的主題,它使操作欄,並與河洛主題設置它,而是獨自離開所有其他元素。因此,操作欄看起來像是「全息」,但其他所有內容都與低版本保持完全一樣(我沒有收到Holo附帶的醜陋文本條目)。

然後在,如果我想有動作條顯示的清單,我只設置爲活動主題,以android:theme="@style/Theme.Black.OptionalActionBar"

我這樣做,特別是因爲我所依託的,現在已經過時,失敗對我的佈局,硬件菜單按鈕。通過使用上述主題,如果需要,可以設置操作欄,或者如果它是較舊的設備,則將其保留爲菜單。然後,我所要做的就是在我的菜單創建方法上設置一個屬性,以無縫地支持2.0到4.0。

無論如何,請看看它是否能讓你到達需要的地方。

在我看來,這比其他方法容易得多,因爲您不必記得請求操作欄或執行代碼中的任何操作。你只需在你的活動中設置你的主題......然後離開你。

+1

正是我在找的。這應該是明顯的答案 – 2013-01-26 23:03:56

+0

但是,這是行不通的。請幫助我 – 2013-09-18 07:07:48