9

Używam Action Bar Compat, więc mój pasek działań z szufladą nawigacji był zgodny wstecz aż do poziomu API 9 i chcę zmienić tło paska akcji.Niestandardowe (gradientowe) tło ActionBar Compat

skopiowane kod z 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> 

I tu pojawia się problem.

Po umieszczeniu obrazu lub tła jako tła, działa dobrze. Jednakże chcę, aby zdefiniować tło jako kształt gradientu, więc moja actionbar_background wygląda następująco:

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

chcę być powtarzane w sposób horyzontalny, ale nawet to powoduje błąd w rzeczywistości, bardzo ciekawy błąd. Urządzenie testowe, a nawet emulator zostanie zrestartowany, gdy spróbuję uruchomić aplikację. Przed ponownym uruchomieniem udało mi się złapać DeadObjectException.

Jak powinien wyglądać tła do rysowania?

Odpowiedz

16

Obecnie pracuję nad tym samym zadaniem.

Oto mój plik action_bar_bg.xml, w którym definiuję gradient dla mojego paska akcji.

<?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" nie mogą być stosowane, jeżeli istnieje gradient środka. Testowałem to; mój Samsung Galaxy Note 10.1 N8000 ponownie uruchomił się i był DeadObjectException.

Typ gradientu typu linear to domyślna wartość . Więc nie musisz tego wyraźnie deklarować.

Oto mój styles.xml w folderze wartości.

<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

@ styl/PeopleCanAct należy zmienić @ styl/MyActionBar otrzymasz błąd kompilacji jak jest –

+0

To działa, chociaż nie rozumiem części DeadObjectException, kiedy urządzenie otrzyma taki wyjątek? – Bruce

16

Innym podejściem, bez modyfikowania styles.xml:

Oto nasz przykład GradientDrawable w 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> 

Można ustawić go na pasku akcji w swoją aktywność na onCreate():

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

Jeśli używasz pomocy biblioteki v7 (danym przypadku):

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

lub jeśli używasz ActionBarSherlock:

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

To też najwyraźniej działa, ale zaakceptowałem drugą odpowiedź, ponieważ wyjaśnia, co było nie tak, mój kod. –

+0

@ Max77 .getDrawable jest teraz przestarzałe. Jaki jest nowy kod zastępujący przestarzałą metodę? – iOSAndroidWindowsMobileAppsDev

+1

@JqueryNinja sprawdź tę dobrą odpowiedź: http://stackoverflow.com/questions/29041027/android-getresources-getdraw-deprecated-api-22 – Max77

0

ja również użyć tego przykładowego kodu z Android Developer i używać XML gradientu jak twoja.

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

znalazłem inny tego pliku pomiędzy twoje i moje jest android:shape="line"/android:shape="rectangle".

Więc próbuję zmienić mój prostokąt na linię. Moja aplikacja również ma ten sam wyjątek, a system operacyjny został zrestartowany. Może kształt jest kluczową kwestią.

+0

To tak naprawdę nie odpowiada na pytanie. Jeśli masz inne pytanie, możesz je zadać, klikając [Zadaj pytanie] (http://stackoverflow.com/questions/ask). Możesz także [dodać nagrodę] (http://stackoverflow.com/help/privileges/set-bounties), aby zwrócić więcej uwagi na to pytanie, gdy już masz wystarczającą [reputację] (http://stackoverflow.com/help/ whats-reputation). – maszter