Jak zmienić kolor tła ActionBar ActionBarActivity za pomocą XML?


277

Detale:

Rozszerzam ActionBarActivity.
Eclipse i SDK w pełni załatane od 2011-11-06.

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14" />  

Wdrożony na urządzeniu Samsung z Androidem 2.3.3
Aplikacja maandroid:theme="@android:style/Theme.Light"

Problem: aplikacja jest jasna, ale ActionBar jest niebieski z szarymi ikonami, ledwo widocznymi na niebieskim tle. Chcę również, aby pasek Actionbar był jasny, aby szare ikony były bardziej widoczne.

Próbowałem modyfikować style, ale bezskutecznie.
Prawdopodobnie brakuje mi czegoś trywialnego.

Jak zmienić kolor tła ActionBar ActionBarActivity za pomocą XML?


2
Zamykanie tego starego kasztana. Wskazuje na Sannidhi, według powszechnego zapotrzebowania, jednak odpowiedzi na to pytanie obejmują kilka wersji Androida, aw moim kontekście David Millers sugerował użycie SherlockActionBar.
user77115

1
Mały smakołyk dla innych: jeśli sprawisz, że pierwszy element w widoku XML będzie miał to samo tło co pasek ActionBar (w naszym przypadku biały), pasek ActionBar zmieni kolor na szary.
Joshua Pinter,

Gdy się nad tym zastanowić, TitleBar i ActionBar nie oferują nic specjalnego. Są bardziej uciążliwe, zwłaszcza gdy ich nie znasz. Lepszą alternatywą byłoby ich ukrycie i zaprojektowanie własnego paska tytułu. Możesz dodawać własne widżety za pomocą widoków i rysunków. Ponieważ pasek tytułu nie zawiera widżetów. Pasek akcji może mieć tylko jedną listę rozwijaną dla wszystkich elementów menu. Nawet wiele aplikacji zrzuciło pasek akcji na korzyść własnych.

Odpowiedzi:


523

Zgodnie z dokumentacją - „Możesz kontrolować zachowanie i widoczność paska akcji za pomocą interfejsów API ActionBar, które zostały dodane do Androida 3.0 (API poziom 11)”.

Dlatego ActionBar nie będzie działał w środowisku docelowym na poziomie API 10 (Android 2.3.3).

Na wszelki wypadek, jeśli celujesz na minimalny poziom API 11, możesz zmienić kolor tła ActionBar poprzez zdefiniowanie własnego stylu, jako:

<resources>
    <style name="MyTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
    </style>

    <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">ANY_HEX_COLOR_CODE</item>
    </style>
</resources>

I ustaw „MyTheme” jako motyw dla aplikacji / aktywności.


12
@AlexanderFragotsis use <item name="android:textColor">@color/my_color</item>.
lethargicpanda

28
To samo podejście należy zastosować w przypadku korzystania z biblioteki ActionBarCompat. Jedyną różnicą jest to, że należy zmienić element actionBarStyle (bez Androida: prefiks), aby zdefiniować, jak pasek działań będzie wyglądał na urządzeniach z Androidem starszym niż 3.0
Alex Semeniuk,

3
Czy istnieje możliwość zamiast zamiast kodu HEX koloru odwoływać się @android:colordo zdefiniowanego w nim koloru niestandardowego colors.xml? Próbowałem bezskutecznie.
jmrodrigg

1
Nie jestem w stanie zmienić koloru tekstu paska akcji za pomocą „<item name =" android: textColor ”> @ color / my_color </item>”
Shirish Herwade

2
Nie działało to dla mnie z Androidem: znacznik tła, ale kiedy pominąłem znacznik Androida i wstawiłem tylko <item name = "background"> ​​kolor zmienił się na wszystkich platformach.
stevyhacker

209

Spróbuj tego

ActionBar bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable("COLOR"));

1
11-06 10: 53: 16.985: E / AndroidRuntime (16956): java.lang.NoSuchMethodError: com.acme.myActivity.getActionBar
user77115 6.11.11

1
@ coder_For_Life22 czy wiesz, jak mogę uzyskać kontekstowy pasek akcji?
Geeks On Hugs

5
afaik, sama biblioteka wsparcia nie ma ActionBar, do tego będziesz musiał dołączyć SherlockActionBar.
David Miler

22
może to dziwne, ale w moim przypadku bar.setBackgroundDrawable(new ColorDrawable(Color.BLUE));zmień kolor paska akcji na szary. Są także dzieje się, jeśli umieścić inny kolor, jak Color.RED, Color.GREENi tak dalej ... Czy ktoś ma ten sam problem, lub zna przyczynę tego problemu? Używam urządzenia Nexus S
AlexAndro

4
stackoverflow.com/a/17198657/1022454 Ten post wydaje się naprawiać problem polegający na tym, że kolor paska akcji staje się szary.
Jonathon Fry

124

Spróbuj tego:

ActionBar bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0000ff")));

1
Jak to pasuje do reszty kodu? Ciekawe, gdzie to dodać
JGallardo,

7
Mam dokładne pytanie jako @JGallardo. Gdzie to dodajesz? Wypróbowałem to, onCreateale dało NullPointerException Edycja: to jest kod, który dodałem do restoreActionBar ActionBar actionBar = getSupportActionBar (); actionBar.setBackgroundDrawable (nowy ColorDrawable (Color.parseColor („# E5E4E2”)));
rockydgeekgod

Dodaj go do metody onCreate swojej aktywności.
Ojonugwa Jude Ochalifu

3
użyj getSupportActionBar () zamiast getActionBar ()
Chanaka Fernando

69

Użyj tego - http://jgilfelt.github.io/android-actionbarstylegenerator/

To niesamowite narzędzie, które pozwala dostosować pasek akcji za pomocą podglądu na żywo.

Próbowałem wcześniejszych odpowiedzi, ale zawsze miałem problemy ze zmianą innych kolorów, takich jak zakładki i litery, i spędziłem godziny na ulepszaniu. To narzędzie pomogło mi wykonać projekt w zaledwie kilka minut.

Oto zrzut ekranu narzędzia

Wszystkiego najlepszego! :)


Jak ustawić aplikację tak, aby korzystała z plików po ich dodaniu do mojej aplikacji?
Mike

W kontekście powyższego zrzutu ekranu (nazwany przykład) po wklejeniu wygenerowanego folderu res powinieneś mieć nowy styl @ style / Theme.Example. W AndroidManifest.xml ustaw <aplikacja android: theme = "@ style / Theme.example">. Powinien działać :)
Mohammad Shabaz Moosa

1
przestarzałe. niestety
Liangjun

55

Miałem ten sam problem, gdy pasek akcji zmieniał kolor na szary, gdy wprowadzałem ten kod. Możliwe, że twój oryginalny arkusz stylów wyglądał tak:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <!-- API 14 theme customizations can go here. -->
</style>

„DarkActionBar” utrzymywał szary pasek akcji. Zmieniłem to na to i zadziałało:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
    <!-- API 14 theme customizations can go here. -->
    <item name="android:actionBarStyle">@style/MyActionBar</item>
</style>

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">#2aa4cd</item>
    <item name="android:titleTextStyle">@style/Theme.MyAppTheme.ActionBar.TitleTextStyle</item>
</style>        

<style name="Theme.MyAppTheme.ActionBar.TitleTextStyle" parent="android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textColor">#FFFFFF</item>
</style>    

Wrzuciłem również sposób edycji koloru tekstu. Ponadto nie trzeba zmieniać niczego wokół zasobów.

-Królikarnia


38

Zachowanie paska akcji można również zmienić w interfejsach API <11

Zobacz oficjalną dokumentację Androida odsyłające

Tworzę aplikację minSdkVersion = "9"i targetSdkVersion = "21"zmieniłem kolor paska akcji i to działa dobrze z API poziomu 9

Oto xml

res/values/themes.xml

<?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">@color/actionbar_background</item>

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

i ustaw żądany kolor paska akcji

res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="actionbar_background">#fff</color> //write the color you want here
</resources>

Kolor paska akcji można również zdefiniować w .classpliku, fragment to

ActionBar bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0000ff")));

ale to nie będzie działać z API <11 , więc stylizowanie paska akcji xmljest tylko sposobem dla API <11



Fragment nie działa w mojej aplikacji, gdy jest używany we fragmencie. Zmieniłem to dla ActionBar bar = getActivity (). GetActionBar (); . Gdy tylko fragment ma zostać otwarty, ulega awarii.
Jose Manuel Abarca Rodríguez

1
Znalazłem problem, działa z: ActionBar actionBar = getSupportActionBar ();
Jose Manuel Abarca Rodríguez

20

Bezpośrednio dodaj tę linię ze swoim kodem koloru

getSupportActionBar().setBackgroundDrawable(
    new ColorDrawable(Color.parseColor("#5e9c00")));

nie trzeba tworzyć obiektu ActionBar za każdym razem ...


1
Lepiej byłoby użyć zasobów, aby uzyskać kolor, niż mieć go jako tekst. getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(android.R.color.black)));
Dinesh

15

Na Nexusie 4 wydaje się, że kolor robi się szary.

ActionBar bar = getActionBar(); // or MainActivity.getInstance().getActionBar()
bar.setBackgroundDrawable(new ColorDrawable(0xff00DDED));
bar.setDisplayShowTitleEnabled(false);  // required to force redraw, without, gray color
bar.setDisplayShowTitleEnabled(true);

(wszystkie podziękowania dla tego postu, ale jest on zakopany w komentarzach, więc chciałem go znaleźć tutaj) https://stackoverflow.com/a/17198657/1022454


2
Ta odpowiedź pomogła mi po spędzeniu niezliczonych godzin na ustaleniu, że WTH jest błędne.
Abdullah Umer

13

wypróbuj jeden kod linii:

getActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.MainColor)));

1
Moja aplikacja ulega awarii przy tej odpowiedzi. Aby działał we fragmencie, zmieniłem go w następujący sposób: getActivity (). GetActionBar (). SetBackgroundDrawable (new ColorDrawable (getActivity (). GetResources (). GetColor (R.color.col_nar))); , również próbował getActivity (). getActionBar (). setBackgroundDrawable (nowy ColorDrawable (getResources (). getColor (R.color.col_nar))); . Awaria następuje po otwarciu fragmentu.
Jose Manuel Abarca Rodríguez

1
Znalazłem problem, działa z: ActionBar actionBar = getSupportActionBar ();
Jose Manuel Abarca Rodríguez

1
odpowiedź dotyczy działania. Jeśli chcesz użyć go z fragmentem, musisz użyć getActivity (). GetActionBar () dla fragmentów
SANAT 16.04.15

7

Użyj poniższego kodu, aby podać inny kolor niż tekst paska akcji i tło paska akcji, po prostu użyj poniżej motywu manifestu przeciwko aktywności, w której chcesz wydrukować :)

<style name="MyTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/MyActionBar</item>
</style>

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:titleTextStyle">@style/TitleBarTextColor</item>
    <item name="android:background">YOUR_COLOR_CODE</item>
</style>

<style name="TitleBarTextColor" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">YOUR_COLOR_CODE</item>
</style>

5

W ten sposób możesz zmienić kolor paska akcji.

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;


public class ActivityUtils {

public static void setActionBarColor(AppCompatActivity appCompatActivity, int colorId){
    ActionBar actionBar = appCompatActivity.getSupportActionBar();
    ColorDrawable colorDrawable = new ColorDrawable(getColor(appCompatActivity, colorId));
    actionBar.setBackgroundDrawable(colorDrawable);
}

public static final int getColor(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        return ContextCompat.getColor(context, id);
    } else {
        return context.getResources().getColor(id);
    }
}
}

W MainActivity.java zmień kolor paska akcji w ten sposób

    ActivityUtils.setActionBarColor(this, R.color.green_00c1c1);

5

Gdy rozszerzasz działalność, użyj następującego kodu

ActionBar actionbar = getActionBar();
actionbar.setBackgroundDrawable(new ColorDrawable("color"));

W przypadku rozszerzania funkcji AppCompatActivity użyj następującego kodu

ActionBar actionbar = getSupportActionBar();
actionbar.setBackgroundDrawable(new ColorDrawable("color"));

2

Ten kod może być pomocny

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
</style>
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- customize the color palette -->
    <item name="colorPrimary">@color/material_blue_500</item>
    <item name="colorPrimaryDark">@color/material_blue_700</item>
    <item name="colorAccent">@color/material_blue_500</item>
    <item name="colorControlNormal">@color/black</item>

</style>
<style name="CardViewStyle" parent="CardView.Light">
    <item name="android:state_pressed">@color/material_blue_700</item>
    <item name="android:state_focused">@color/material_blue_700</item>
    <!--<item name="android:background">?android:attr/selectableItemBackground</item>-->
</style>


1

Użyj tego kodu ... aby zmienić kolor tła paska akcji. otwórz „res / wartości / themes.xml” (jeśli nie jest obecny, utwórz go) i dodaj

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
       parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/MyActionBar</item>
</style>
 <!-- ActionBar styles -->
<style name="MyActionBar"
       parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@drawable/actionbar_background</item>
</style>

Uwaga: ten kod działa tylko dla Androida 3.0 i wyższych wersji


1

To zadziałało dla mnie, dla AppCompatActivity,

    <item name="actionBarStyle">@style/BlackActionBar</item>
</style>

<style name="BlackActionBar" parent="@style/Widget.AppCompat.ActionBar.Solid">
    <item name="background">@android:color/black</item>
    <item name="titleTextStyle">@style/BlackActionBarTitleTextStyle</item>
</style>

<style name="BlackActionBarTitleTextStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">@android:color/white</item>
    <item name="android:fontFamily">@font/cinzel_decorative</item>
</style>

1

Jest to bardzo proste dla tych, którzy używają API 21 lub nowszego Użyj tego kodu poniżej

dla Dark ActionBar

<resources>
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="android:background">@color/colorDarkGrey</item>
</style>

for_LightActionBar

<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.ActionBar">
    <item name="android:background">@color/colorDarkGrey</item>
</style>

0

Użyj tego, to zadziała.

ActionBar actionbar = getActionBar();
actionbar.setBackgroundDrawable(new ColorDrawable("color"));

0

Czasami ta opcja zgłasza wyjątek NullPointerException

ActionBar actionbar = getActionBar(); actionbar.setBackgroundDrawable(new ColorDrawable("color"));

Ale ta opcja działa dla mnie. Możesz więc spróbować.

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FFFFFF")));

Happy Coding


0

Jeśli używasz aplikacji Androidx AppCompact. Użyj poniższego kodu.

androidx.appcompat.app.ActionBar actionBar = getSupportActionBar();
actionBar.setBackgroundDrawable(new ColorDrawable("Color"));

-2
getActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.TabColor)));

plik color.xml:

<resources> <color name="TabColor">#11FF00</color> </resources>`
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.