9

我正在使用Action Bar Compat,以便我的導航抽屜的操作欄向後兼容到API級別9,並且我想更改操作欄的背景。ActionBar的自定義(漸變)背景Compat

我從Android Developers複製代碼:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<!-- the theme applied to the application or activity --> 
<style name="CustomActionBarTheme" 
     parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:actionBarStyle">@style/MyActionBar</item> 

    <!-- Support library compatibility --> 
    <item name="actionBarStyle">@style/MyActionBar</item> 
</style> 

<!-- ActionBar styles --> 
<style name="MyActionBar" 
     parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse"> 
    <item name="android:background">@drawable/actionbar_background</item> 

    <!-- Support library compatibility --> 
    <item name="background">@drawable/actionbar_background</item> 
</style> 
</resources> 

這裏來的問題。

當我把圖像繪製或顏色作爲背景時,它工作正常。不過,我想定義背景爲漸變狀,所以我actionbar_background樣子:

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="line"> 
<gradient 
     android:startColor="@color/ac_bg_start" 
     android:endColor="@color/ac_bg_end" 
     android:type="linear"/> 
<size 
     android:width="1dp" 
     android:height="48dp"/> 
</shape> 

我希望它在橫向的方式被重複,但即使這會導致錯誤,其實是很有趣的錯誤。當我嘗試運行應用程序時,測試設備甚至是仿真器都會重新啓動。重新啓動之前,我能夠趕上DeadObjectException

應該如何繪製背景?

回答

16

我目前正在進行相同的任務。

這是我的action_bar_bg.xml文件,其中我定義了我的操作欄的漸變。

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <gradient 
     android:angle="90" 
     android:centerColor="@color/turquoise_action_bar" 
     android:endColor="@color/dark_turquoise" 
     android:startColor="@color/dark_turquoise" /> 
</shape> 

DeadObjectException

android:shape="line"如果存在內部梯度,不能使用。我測試了它;我的三星Galaxy Note 10.1 N8000重新啓動,並且有一個DeadObjectException

linear類型的梯度模式是默認值。所以你不必明確地聲明它。

這裏是我的styles.xml中的文件夾。

<resources> 

    <!-- Base application theme. --> 
    <style name="AppThemeBase" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="android:actionBarStyle">@style/PeopleCanAct</item> 
     <!-- Support library compatibility --> 
     <item name="actionBarStyle">@style/MyActionBar</item> 
    </style> 

    <style name="AppTheme" parent="AppThemeBase"> 
     <!-- All the customizations that are NOT specific to a particular API level can go here --> 
    </style> 

    <!-- ActionBar styles --> 
    <style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse"> 
     <item name="android:background">@drawable/action_bar_bg</item> 
     <!-- Support library compatibility --> 
     <item name="background">@drawable/action_bar_bg</item> 
    </style> 

</resources> 

+1

<項目名稱=「機器人:actionBarStyle」> @風格/ PeopleCanAct應改爲<項目名稱=「機器人:actionBarStyle」> @風格/ MyActionBar你會得到一個編譯錯誤的,是 –

+0

這工作,儘管我不明白DeadObjectException部分,但設備何時會得到該異常? – Bruce

16

另一種方法,而無需修改styles.xml

這裏是我們的榜樣GradientDrawable在res/drawable/ab_gradient.xml

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

    <gradient 
     android:angle="90" 
     android:startColor="#000000" 
     android:endColor="#FFFFFF" 
     android:type="linear" /> 

</shape> 

你可以將其設置爲操作欄在你活動的onCreate()

ActionBar actionBar = getActionBar();  
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_bar_gradient_shape)); 

如果使用支持V7庫(你的情況):

// make sure to import android.support.v7.app.ActionBar 
ActionBar actionBar = getSupportActionBar();   
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_bar_gradient_shape)); 

或者,如果你使用ActionBarSherlock:

// make sure to import com.actionbarsherlock.app.ActionBar 
ActionBar actionBar = getSherlock().getActionBar();  
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_bar_gradient_shape)); 
+0

這顯然也有效,但我接受了其他答案,因爲它解釋了我的代碼出了什麼問題。 –

+0

@ Max77 .getDrawable現在已棄用。什麼是代替棄用方法的新代碼? – iOSAndroidWindowsMobileAppsDev

+1

@JqueryNinja檢查這個很好的答案:http://stackoverflow.com/questions/29041027/android-getresources-getdrawable-deprecated-api-22 – Max77

0

我也使用來自Android開發者是示例代碼和使用漸變XML和你的一樣。

<shape 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="line"> 

我發現你和我之間的文件不同的是,android:shape="line"/android:shape="rectangle"

所以我嘗試改變我的矩形線。我的應用程序也出現相同的異常,並且操作系統重新啓動。也許形狀是關鍵。

+0

這並沒有真正回答這個問題。如果您有不同的問題,可以通過單擊[提問](http://stackoverflow.com/questions/ask)來提問。您還可以[添加賞金](http://stackoverflow.com/help/privileges/set-bounties)在您擁有足夠的[聲譽](http://stackoverflow.com/help/)時吸引更多人關注此問題什麼聲譽)。 – maszter