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

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

Giorgio
fonte
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.

codercat
fonte
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>
Niels
fonte
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));
itzhar
fonte
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>
Faisal Shaikh
fonte
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

Moti Bartov
fonte
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));
}
Steve Moretz
fonte
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>
lcompare
fonte
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>
Amin Keshavarzian
fonte
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));
    }
}
sajad abbasi
fonte
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">
DSoldo
fonte
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>

PhilipS
fonte
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>
poder da radão
fonte
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
}
Nabin
fonte
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

Allan
fonte
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));
        }
    }
Harpreet
fonte
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);
Vova K.
fonte
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>
Engr Syed Rowshan Ali
fonte