Como mudar a cor da barra de Estado no android

Em primeiro lugar, não é um duplicado como em como mudar a cor de fundo da barra de Estado do android

Como é que eu mudo a cor da barra de Estado que deve ser a mesma que na barra de navegação.

quero que a cor da barra de Estado seja igual à cor da barra de navegação

enter image description here

Author: Community, 2014-03-05

13 answers

O Android 5.0 Lollipop introduziu o tema de design de materiais que coloriza automaticamente a barra de estado com base no valor colorPrimaryDark do tema.

Isto é suportado no dispositivo pré-Chupa graças ao suporte da biblioteca-v7-appcompat a partir da versão 21. Blogpost sobre suporte appcompat v21 de Chris Banes

enter image description here

Leia mais sobre o tema do Material no site oficial de Desenvolvedores Android

 442
Author: Giorgio, 2018-05-10 07:04:02

Actualização:

Chupa-Chupa:

public abstract void setStatusBarColor (int color)

Adicionado ao nível 21 da API

O Lollipop Android trouxe consigo a capacidade de mudar a cor da barra de Estado no seu aplicativo para uma experiência de usuário mais imersiva e em sintonia com o Google Material Design Guidelines.

Aqui está como você pode mudar a cor da barra de estado usando o novo método window.setStatusBarColor introduzido em API level 21.

Mudar a cor da barra de Estado também necessita de definir duas opções adicionais na janela; você é necessário adicionar a bandeira FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS e limpar a bandeira FLAG_TRANSLUCENT_STATUS.

Código De Trabalho:

Window window = activity.getWindow();

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));

Referência oficial do programador: setStatusBarColor (int)

Exemplo: material-design-em todo o lado

Chris Banes Blog-appcompat v21: material design para dispositivos pré-Chupa-Chupa!

enter image description here

O transitionName para o fundo da vista será android:status:background.

 265
Author: codercat, 2018-03-15 11:33:23

Coloque estes são os seus valores-v21 / styles.xml, para activar isto no Chupa-Chupa:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">@color/color_primary</item>
    </style>
</resources>
 151
Author: Niels, 2014-11-14 10:20:11
Esta é uma maneira muito fácil de fazer isto sem qualquer biblioteca.: se a versão do SO não for suportada - sob o kitkat - então nada acontece. eu faço isto:
  1. no meu xml adicionei ao topo esta Vista:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

Depois fiz este método:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

Também precisa desses dois métodos para obter a altura da barra de acção e o estado da barra:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Então a única coisa que você precisa é esta linha para definir a cor da barra de Estado:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
 46
Author: itzhar, 2014-10-06 12:37:26
Bem, a solução Izhar estava bem, mas ... , pessoalmente, eu estou tentando evitar de um código que parece ser este:
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};
Também não gosto de duplicar o código. Na sua resposta, Tenho de acrescentar essa linha de código em todas as actividades:
setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
Então, peguei na solução Izhar e usei XML para obter o mesmo resultado: Criar uma disposição para a barra de estado_ barra de Estado.xml
<View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/statusBarHeight"
     android:background="@color/primaryColorDark"
     android:elevation="@dimen/statusBarElevation">

Repare nos atributos altura e altitude, estes serão definidos em valores, valores-v19, valores-v21 mais abaixo.

Adicione esta disposição à sua disposição de actividades usando a opção include, main_ Activity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

Para a barra de ferramentas, adicione o atributo top margin:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">

No teu estilo appTheme-v19.xml e styles-v21.xml, adicionar o attr do windowTranslucent:

Styles-v19.xml, v21:

<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>

E finalmente, no seu dimens, dimens-v19, dimens-v21, adicione os valores para a barra de ferramentas topMargin, e a altura da barra de estado: dimens.xml para inferior a KitKat:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

A altura da barra de Estado é sempre 24dp dimens-v19.xml para o KitKat e acima:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

Dimens-v21.xml para o Lolipop, basta adicionar a elevação se necessário:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>
Este é o resultado do KitKat de gelatina e do Chupa-Chupa.

enter image description here

 29
Author: Moti Bartov, 2015-07-15 18:41:37

Basta criar um novo tema em res / values / styles.xml onde você muda a "colorPrimaryDark" que é a cor da barra de Estado:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

E modificar o tema de actividade em AndroidManifest.xml para o que quiser, na próxima actividade poderá mudar a cor de volta para a original, seleccionando o tema original:

<activity
    android:name=".LoginActivity"
    android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

É assim que o seu res / valores / cores.o xml deve ser parecido com:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>
 15
Author: lcompare, 2017-03-23 11:17:36

Eu tinha este requisito: mudar programaticamente a cor da barra de Estado mantendo-a Transparente , para permitir que a gaveta de navegação desenhasse a si própria sobrepondo a barra de Estado de trasparent.

Não posso fazer isso usando a API

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

Se você verificar aqui na pilha overflow todos antes dessa linha de código definir a transparência da barra de Estado para sólido com {[[10]}

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

Sou capaz de gerir a cor e a transparência {[9] } da barra de Estado como isto:

  • Android 4: não há muito que você possa fazer, porque você não pode gerenciar a cor da barra de estado da API ... a única coisa que você pode fazer é definir a barra de Estado como translúcida e mover um elemento colorido de você UI sob a barra de Estado. Para fazer isso você precisa jogar com

    android:fitsSystemWindows="false"
    

    Na sua planta principal. Isto permite-lhe desenhar a sua disposição sob a barra de Estado. Então você precisa jogar com algum enchimento com o topo do seu layout principal.

  • Android 5 e ... acima: você tem que definir um estilo com

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>

Isto permite que a gaveta de navegação sobreponha a barra de Estado.

Depois, para mudar a cor mantendo a barra de estado transparente, terá de definir a cor da barra de estado com

drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))

Onde o drawerLayout é definido desta forma

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
 9
Author: DSoldo, 2017-10-10 08:20:05

Como @Niels disse Você tem que colocar em valores-v21/styles.xml:

<item name="android:statusBarColor">@color/black</item>

Mas adicione tools:targetApi="lollipop" Se quiser estilos únicos.xml, como:

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>
 8
Author: Faisal Shaikh, 2018-02-01 14:45:39

Você pode alterar a cor da barra de estado com esta função. works on android L means API 21 and higher and needs a color string such as "#ffffff".

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}
 6
Author: sajad abasi, 2017-12-28 22:55:36
Se quer trabalhar no Android 4.4 e acima, experimente isto. Refiro-me à resposta de Harpreet e a esta ligação. Android e a barra de estado transparente

Primeiro, chama o método setStatusBarColored no método oncreato da actividade (pu-lo numa classe util). Eu uso uma imagem aqui, você pode mudá-la para usar uma cor.

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}
Antes: before

Depois: after

A cor da barra de Estado foi alterada, mas a barra de navi está cortada, por isso precisamos fixar a margem ou o desvio da barra navi no método do oncreato.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }
Então a barra de Estado ficará assim.

status bar

 4
Author: Allan, 2017-06-17 02:15:32
Isto foi o que funcionou para mim em KitKat e com bons resultados.
public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }
 3
Author: Harpreet, 2016-04-20 19:23:20

Mais uma solução:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);
 2
Author: Vova K., 2015-09-27 17:38:50

Edite o colorprimário nas cores.xml em valores para a cor que deseja que a barra de Estado seja. Por exemplo:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>

 1
Author: PhilipS, 2018-09-06 10:18:13