Como alterar a cor da barra de status no Android?


427

Primeiro, não é uma duplicata, como em Como alterar a cor de fundo da barra de status do Android

Como altero a cor da barra de status, que deve ser a mesma da barra de navegação.

Quero que a cor da barra de status seja igual à cor da barra de navegação

insira a descrição da imagem aqui


2
é possível somente após kitkat @MarkBuikema
— codercat 5/14

4
Como Niels sugere, existe um ATRIBUTO TEMÁTICO desde a v21 chamada android:statusBarColor. Você pode simplesmente adicioná-lo values-v21/styles.xml.
— Levite

@MarkBuikema Como isso está relacionado ao acesso root?
— Steve Moretz

Respostas:


625

O Android 5.0 Lollipop introduziu o tema Design de materiais, que colore automaticamente a barra de status com base no colorPrimaryDarkvalor do tema.

Isso é suportado no pré-pirulito do dispositivo, graças à biblioteca support-v7-appcompat a partir da versão 21. Blogpost sobre suporte appcompat v21 de Chris Banes

insira a descrição da imagem aqui

Leia mais sobre o Tema material no site oficial do Android Developers


29
por algum motivo, o atributo colorPrimaryDark não funciona para mim. tentei no emulador v21
— desviante

3
Ele funciona você tem que ver as mudanças no emulador não na visualização de layout [ele não mostra lá]
— Mightian

6
O colorPrimaryDark também não está funcionando para mim em um emulador API 18. No artigo vinculado sobre appcompat: "Em plataformas mais antigas, o AppCompat emula a temática de cores sempre que possível. No momento, isso se limita a colorir a barra de ação e alguns widgets".
— Adam Johns

12
Que tal mudar a cor da fonte na barra de status? Os documentos não dizem nada sobre isso.
— 21715 Scott Scott

Eu tentei da mesma maneira. ele funciona perfeitamente na maioria dos dispositivos, mas eu tenho o samsung galaxy s4 executando o OS 5.0.1 e nessa barra de status do telefone a cor é preta. E quando eu vou para outra atividade e volto à atividade anterior, a cor da minha barra de status é alterada para a cor do tema do aplicativo. Qualquer razão por que isso está acontecendo
— Hitesh Kamani

364

Atualizar:

Pirulito:

public abstract void setStatusBarColor (int color)

Adicionado no nível 21 da API

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

Aqui está como você pode alterar a cor da barra de status usando o novo window.setStatusBarColormétodo introduzido no API level 21.

Alterar a cor da barra de status também requer a configuração de dois sinalizadores adicionais na janela; você precisa adicionar a FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSbandeira e limpá-la FLAG_TRANSLUCENT_STATUS.

Código de trabalho:

import android.view.Window;

...

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 desenvolvedor: setStatusBarColor (int)

Exemplo: material-design-em qualquer lugar

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

insira a descrição da imagem aqui

O transitionNameplano de fundo da visualização será android:status:background.


2
Alguma solução para compatibilidade com versões anteriores?
— Adam Hurwitz

Conforme observado na resposta de Niels: você também pode configurar a cor da barra de status via tema / estilo, definindo android:statusBarColorno seu values-v21/styles.xmlarquivo como androiddocs.com/training/material/theme.html assim<item name="android:statusBarColor">@color/primary_color</item>
— JL West

4
posso mudar a cor da barra de status para branco, mas não consigo ver o ícone de notificação como bateria, como posso resolver isso?
— MNFS 24/07/19

1
você não tem idéia do quanto você acabou de me ajudar ..
— Abhishek Dhyani

222

Coloque este é o seu values-v21 / styles.xml, para habilitá-lo no Lollipop:

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

34
isso requer min API 21
— Roman

49
Provavelmente é por isso que ele sugeriu colocá-lo em values-v21 / styles.xml ;-) Parece ser a resposta mais precisa até agora!
— Levite

Mas isso ainda sinaliza um aviso !!?
— Nihal Sharma

qual é a função para compat? barra de status
— blackHawk

você pode adicionar um targeApiatributo se desejar manter um único arquivo de estilo. Leia minha resposta para referência stackoverflow.com/a/48565459/4291272
— Faisal Shaikh 15/03/19

50

essa é uma maneira muito fácil de fazer isso sem nenhuma biblioteca: se a versão do sistema operacional não for suportada - no kitkat -, nada acontecerá. eu faço estas etapas:

  1. no meu xml eu adicionei ao topo esta View:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

então eu 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);
     }
}

você também precisa dos dois métodos para obter a barra de ação e a altura da barra de status:

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;
}

a única coisa que você precisa é desta linha para definir a cor da barra de status:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

1
onde devo colocar o elemento view? deveria estar no topo do layout principal?
— Emil Rena Enriquez

Sim. No seu xml. No topo disso.
— itzhar

Cuidado: trabalhando apenas para o Android> = 19 API. No meu caso, preciso de suporte a partir de 16
— Anton Kizema

setStatusBarColor (findViewById (android.R.id.statusBarBackground), getResources (). getColor (android.R.color.white));
— AndroidLad

34

Como o @Niels disse, você deve colocar no values-v21 / styles.xml:

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

Mas adicione tools:targetApi="lollipop"se você quiser um único styles.xml, como:

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

3
Muito obrigado por "targetApi". Não gosto de espalhar meu tema por vários arquivos. :)
— plexus

31

Bem, a solução Izhar estava OK, mas, pessoalmente, estou tentando evitar um código que se parece com isso:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};

Também não gosto de duplicar código. Na sua resposta, tenho que adicionar essa linha de código em todas as atividades:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

Então, peguei a solução Izhar e usei XML para obter o mesmo resultado: Crie um layout para o StatusBar status_bar.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">

Observe os atributos de altura e elevação, estes serão definidos em valores, valores-v19, valores-v21 mais abaixo.

Inclua esse layout no layout de atividades usando 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 de margem superior:

<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 appTheme style-v19.xml e styles-v21.xml, adicione a janelaTranslucent attr:

styles-v19.xml, v21:

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

E, finalmente, em seu dimens, dimens-v19, dimens-v21, adicione os valores para topMargin da barra de ferramentas e a altura do statusBarHeight: dimens.xml por menos de KitKat:

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

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

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

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

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

Este é o resultado para o Jellybean KitKat e o Lollipop:

insira a descrição da imagem aqui


Então, em vez de colocar o código de verificação, você o coloca em XML. Sua solução funcionará em Kitkat, exatamente como ele conseguiu.
— desenvolvedor android

26

Você pode usar este código simples:

Uma linha em Kotlin:

window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)

Resposta original com Java e verificação manual da versão:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}

Você pode simplificar ainda mais isso usando ContextCompat. Em Kotlin-lo, então é apenas isso:window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
— sunadorer

Até o momento eu escrevi eu não tinha tentado kotlin.Why não editar a resposta e eu posso aprová-lo :)
— steve Moretz

Boa ideia. Eu incluí a minha sugestão na resposta como uma referência fácil para os futuros visitantes
— sunadorer

a cor da barra de status mudou acima de Build.VERSION_CODES.M. não funciona abaixo do pirulito
— Muhammed Haris

@MuhammedHaris funciona.Você usou o código kotlin ou java?
— steve moretz 16/03

23

Basta criar um novo tema em res / values ​​/ styles.xml, onde você altera o "colorPrimaryDark", que é a cor da barra de status:

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

E modifique o tema da atividade no AndroidManifest.xml para o desejado, na próxima atividade, você pode alterar a cor novamente para a original selecionando 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 seus res / values ​​/ colors.xml devem se parecer:

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

1
Penso que esta é a solução mais simples e limpa. Não é necessário ter um nível mínimo de API 21 , apenas substituição simples. Merece mais votos positivos.
— precisa saber é o seguinte

Isso não funcionou ao executar no nível Nougat e API definido como 19. Funcionou se eu definir android: theme no nó do aplicativo no manifesto.
— AndroidDev 16/05/19

18

Para alterar a cor do lolipop acima, basta adicioná-lo ao seu styles.xml

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

mas lembre- se, se você quiser ter uma cor clara para a barra de status, adicione esta linha também

<item name="android:windowLightStatusBar">true</item>

1
Thanx, é uma resposta útil também.
— Andrew Grow

16

Você pode alterar a cor da barra de status com esta função. funciona no Android L significa API 21 e superior e precisa de uma sequência de cores como "#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));
    }
}

15

Eu tinha esse requisito: Alterar programaticamente a cor da barra de status, mantendo-a transparente , para permitir que a Gaveta de Navegação se desenhe sobrepondo a barra de status transparente.

Não posso fazer isso usando a API

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

Se você marcar aqui no estouro de pilha, todos os que estão antes dessa linha de código configuram a transparência da barra de status para sólida com

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

Eu sou capaz de gerenciar a cor e a transparência da barra de status assim:

  • Android 4: não há muito o que fazer, porque você não pode gerenciar a cor da barra de status a partir da API ... a única coisa que você pode fazer é definir a barra de status como translúcida e mover um elemento colorido da sua interface do usuário sob o status Barra. Para fazer isso, você precisa brincar com

    android:fitsSystemWindows="false"

    no seu layout principal. Isso permite que você desenhe seu layout na barra de status. Então você precisa brincar com alguns preenchimentos com a parte superior do layout principal.

  • Android 5 e superior: você precisa definir um estilo com

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

    isso permite que a gaveta de navegação se sobreponha à barra de status.

    Para alterar a cor, mantendo a barra de status transparente, você deve definir a cor da barra de status com

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

    onde drawerLayout é definido assim

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

Funcionou para mim sem <item name="android:windowDrawsSystemBarBackgrounds">true</item>. De qualquer forma, após dias de pesquisa, encontrei algo que realmente funciona (testado apenas no Lolllipop no momento). Obrigado
— DenisGL

Eu estava tendo o mesmo problema e sua resposta me ajudou a resolver isso.
— A.Gun

7

Edite o colorPrimary no colors.xml em Valores para a cor que você deseja que a Barra de Status 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>


7

Para alterar a cor da barra de status, vá para res/values-v21/styles.xmle cor da barra de status

<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">#0000FF</item>
    </style>
</resources>

Ei, você poderia me ajudar? Não tenho idéia do Android e não posso começar a aprender agora. Eu tenho um aplicativo simples que executa um arquivo html. Estou morrendo de vontade de mudar a cor da barra de status, porque a parte superior e inferior do número 000 é horrível para o meu paleta. Mas eu simplesmente não consigo, nem consigo encontrar o arquivo styles.xml ... Se eu pudesse enviar meu apk e você o definir, ficarei grato!
— Thiago Soubra

6

Se você deseja alterar a cor da barra de status programaticamente (e desde que o dispositivo tenha o Android 5.0). Essa é uma maneira simples de alterar statusBarColor de qualquer Atividade e métodos muito fáceis quando fragmentos diferentes têm cores de barra de status diferentes.

 /**
 * @param colorId id of color
 * @param isStatusBarFontDark Light or Dark color
 */
fun updateStatusBarColor(@ColorRes colorId: Int, isStatusBarFontDark: Boolean = true) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.statusBarColor = ContextCompat.getColor(this, colorId)
        setSystemBarTheme(isStatusBarFontDark)
    }
}

/** Changes the System Bar Theme.  */
@RequiresApi(api = Build.VERSION_CODES.M)
private fun setSystemBarTheme(isStatusBarFontDark: Boolean) {
    // Fetch the current flags.
    val lFlags = window.decorView.systemUiVisibility
    // Update the SystemUiVisibility depending on whether we want a Light or Dark theme.
    window.decorView.systemUiVisibility = if (isStatusBarFontDark) lFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() else lFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}

5

Se você deseja trabalhar no Android 4.4 e superior, tente isso. Refiro-me à resposta de Harpreet e a este link. Android e a barra de status transparente

Primeiro, chame o método setStatusBarColored no método onCreate da Activity (coloquei em uma classe util). Eu uso uma imagem aqui, você pode alterá-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: antes

Depois de: depois de

A cor da barra de status foi alterada, mas a barra de navegação está cortada; portanto, precisamos definir a margem ou o deslocamento da barra de navegação no método onCreate.

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);
    }

A barra de status ficará assim.

Barra de status


4

Foi o que funcionou para mim no 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));
        }
    }

2

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);

Isso funcionará em tablets onde a barra de status está na parte inferior da tela?
— guy.gc

6
o que é 'w' e 'UiUtil' aqui?
— Manav Patadia

2

altere o colorPrimaryDark para a cor desejada para o arquivo res / values ​​/ styles.xml

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <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>
    </resources>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.