Como alterar a cor da barra de status para combinar com o aplicativo no Lollipop? [Android]

96

Na nova atualização do pirulito, percebi que, com os aplicativos nativos do Google, a cor da barra de status muda para corresponder à barra de ação no aplicativo que você está executando. Vejo que está no aplicativo do Twitter também, então acho que não é exclusivamente o Google que pode fazer isso.

Alguém sabe fazer isso se for possível?

Briscoooe
fonte

Respostas:

220

Para alterar a cor da barra de status, use setStatusBarColor (int color) . De acordo com o javadoc, também precisamos definir alguns sinalizadores na janela.

Trecho de código de trabalho:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(activity, R.color.example_color));


Lembre-se de que a cor da barra de status das diretrizes do Material Design e a cor da barra de ação devem ser diferentes:

  • ActionBar deve usar cores primárias 500
  • StatusBar deve usar cores 700 primárias

Veja a imagem abaixo:

insira a descrição da imagem aqui

klimat
fonte
4
Observe que o efeito pode não aparecer no emulador. Por exemplo, este projeto de amostra tinge a barra de status em um Nexus 9, mas não em um emulador Android 5.0.
CommonsWare
1
@mate: Eu estava me referindo ao emulador Android SDK. É bom saber que está funcionando no Genymotion.
CommonsWare 01 de
3
@Azad Não, não precisa. Para usar o trecho de código acima, você deve garantir que seu dispositivo esteja executando a API 21 ou superior.
klimat
1
Estou trabalhando em um projeto relativamente simples e devo dizer que acabei de usar getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));e funcionou perfeitamente. Não tenho certeza sobre o contexto em que os sinalizadores são estritamente necessários.
Joaquin Iurchuk,
3
Eu quero mostrar a cor em dispositivos pré-pirulito também. Como pode ser feito?
WISHY
48

Basta adicionar isso em seu styles.xml. O colorPrimary é para a barra de ação e o colorPrimaryDark é para a barra de status.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
</style>

Esta imagem do desenvolvedor android explica mais sobre a paleta de cores. Você pode ler mais neste link .

insira a descrição da imagem aqui

Gjoko Bozinov
fonte
O Android Studio cria as seguintes entradas para cada projeto: <color name="colorPrimary">#somecolor</color>e <color name="colorPrimaryDark">#somecolor</color>. Eles podem ser alterados para obter o efeito desejado.
Neurotransmissor
41

Outra forma de definir a cor da barra de status é por meio do style.xml .

Para fazer isso, crie um style.xml arquivo sob res / valores-v21 pasta com este conteúdo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material">
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="android:colorPrimaryDark">@color/blue_dark</item>
    </style>
</resources>

Editar: conforme apontado nos comentários, ao usar AppCompat o código é diferente. No arquivo res / values ​​/ style.xml, use:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">   
    <!-- Set AppCompats color theming attrs -->
    <item name="colorPrimary">@color/my_awesome_red</item>
    <item name="colorPrimaryDark">@color/my_awesome_darker_red</item>
    <!-- Other attributes -->
</style>
Alberto Malagoli
fonte
1
Fiz isso. Mas não funcionou. Mas então eu uso AppCompat em vez de Material.
Martin
3
@Martin Para appcompat, use colorPrimaryDark sem o prefixo android.
Michiel de
não está funcionando para appcompat também (testado no Nível 18)
Mohammad Zekrallah
A cor da barra de status só funcionará em dispositivos com OS API Nível 21 e superior. Além disso, em seu manifesto, certifique-se de não substituir esse estilo em atividades individuais.
Levon
para inappbrowser como alterar a cor da barra de pesquisa da mesma forma que a cor do aplicativo
R.Anandan
23

Para definir a cor da barra de status, crie um arquivo style.xml na pasta res / values-v21 com este conteúdo:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppBaseTheme" parent="AppTheme">
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/blue</item>
    </style>

</resources>
Muhammad Aamir Ali
fonte
diz que não é possível resolver o símbolo windowDrawsSystemBarBackgrounds
jmhostalet
4

Adicione esta linha no estilo de v21 se você usar dois estilos.

  <item name="android:statusBarColor">#43434f</item>
Amit Walke
fonte
Isso não funciona sem definir o sinalizadorandroid:windowDrawsSystemBarBackgrounds
eslavo
4

Além disso, se você quiser status-barcores diferentes para atividades diferentes ( fragmentos ), você pode fazer isso com as seguintes etapas (trabalhar na API 21 e acima):

Primeiro crie values21/style.xmle coloque o seguinte código:

 <style name="AIO" parent="AIOBase">
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:windowContentTransitions">true</item>
    </style>

Em seguida, defina os temas Branco | Escuro da values/style.xmlseguinte forma:

 <style name="AIOBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_primary_dark</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:textColorPrimary">@android:color/black</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@color/color_primary_dark
        </item>
        <item name="android:textColor">@color/gray_darkest</item>
        <item name="android:windowBackground">@color/default_bg</item>
        <item name="android:colorBackground">@color/default_bg</item>
    </style>


    <style name="AIO" parent="AIOBase" />

    <style name="AIO.Dark" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#171717
        </item>
    </style>

    <style name="AIO.White" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#bdbdbd
        </item>
    </style>

Também não se esqueça de aplicar temas em seu manifest.xml.

Amir
fonte
2

Em dispositivos Android pré Lollipop, você pode fazer isso em SystemBarTintManager. Se você estiver usando o android studio, basta adicionar Systembartint lib em seu arquivo gradle.

dependencies {
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    ...
}

Então em sua atividade

// create manager instance after the content view is set
SystemBarTintManager mTintManager = new SystemBarTintManager(this);
// enable status bar tint
mTintManager.setStatusBarTintEnabled(true);
mTintManager.setTintColor(getResources().getColor(R.color.blue));
Muhammad Aamir Ali
fonte