9

Ich benutze Action Bar Compat, so dass meine Aktionsleiste mit Navigationsschub abwärtskompatibel bis API Level 9 war und ich den Hintergrund der Aktionsleiste ändern möchte.Custom (Farbverlauf) Hintergrund von ActionBar Compat

kopierte ich den Code aus 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> 

Und hier kommt das Problem.

Wenn ich ein Bild ziehbare oder eine Farbe als Hintergrund, es funktioniert gut. Allerdings mag ich den Hintergrund als Farbverlauf Form definieren, so dass meine actionbar_background wie folgt aussieht:

<?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> 

Ich will es in horizontaler Weise wiederholt werden, aber auch dies führt zu Fehler in der Tat sehr interessant Fehler. Testgerät und sogar der Emulator wird neu gestartet, wenn ich versuche, die App auszuführen. Ich konnte DeadObjectException vor dem Neustart fangen.

Wie sollte der Hintergrund ausklappbar aussehen?

Antwort

16

Ich arbeite derzeit an der gleichen Aufgabe.

Hier ist meine action_bar_bg.xml Datei, in der ich den Farbverlauf für meine Aktionsleiste definieren.

<?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" kann nicht verwendet werden, wenn ein Gradient dort nach innen ist. Ich habe es getestet; mein Samsung Galaxy Note 10.1 N8000 neu gestartet, und es gab eine DeadObjectException.

Der linear Typ des Gradientenmusters ist der Standard Wert. Sie müssen es also nicht explizit deklarieren.

Hier ist meine styles.xml in der Werte Ordner.

<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

@ style/PeopleCanAct sollte auf geändert werden @ style/MyActionBar Sie einen Kompilierungsfehler erhalten wie sie ist –

+0

Dies funktioniert, Obwohl ich den DeadObjectException-Teil nicht verstehe, wann wird ein Gerät diese Ausnahme bekommen? – Bruce

16

Ein anderer Ansatz, ohne styles.xml zu ändern:

Hier ist unser Beispiel GradientDrawable in 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> 

Sie können es auf der Aktionsleiste in Ihrer Aktivität Besteck onCreate():

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

Wenn Sie Unterstützung v7-Bibliothek (Ihr Fall):

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

Oder wenn Sie ActionBarSherlock verwenden:

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

Das funktioniert anscheinend auch, aber ich akzeptierte die andere Antwort, weil es erklärt, was mein Code falsch war. –

+0

@ Max77 .getDrawable ist jetzt veraltet. Was ist der neue Code, um die veraltete Methode zu ersetzen? – iOSAndroidWindowsMobileAppsDev

+1

@JqueryNinja überprüfen Sie diese gute Antwort: http://stackoverflow.com/questions/29041027/android-getresources-getdrawable-deprecated-api-22 – Max77

0

ich auch, dass Beispielcode von Android Developer und die Gradienten XML verwenden so wie deine.

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

fand ich die andere diese Datei zwischen deinem und meinem android:shape="line"/android:shape="rectangle" ist.

Also versuche ich mein Rechteck in Linie zu ändern. Meine App tritt ebenfalls die gleiche Ausnahme auf und das Betriebssystem wird neu gestartet. Vielleicht ist die Form der Schlüsselpunkt.

+0

Dies beantwortet nicht wirklich die Frage. Wenn Sie eine andere Frage haben, können Sie sie durch Klicken auf [Frage stellen] (http://stackoverflow.com/questions/ask) stellen. Sie können [Kopfgeld hinzufügen] (http://stackoverflow.com/help/privileges/set-bounties) hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken, sobald Sie genug [Reputation] haben (http://stackoverflow.com/help/). Whats-Reputation). – maszter

Verwandte Themen