Alterar a cor da barra de status com AppCompat ActionBarActivity

146

Em uma das minhas atividades, alterei a cor da barra de ferramentas usando Palette. Mas em dispositivos 5.0, ActionBarActivitya status barcor é a cor do meu colorPrimaryDarktema de atividade, por isso tenho duas cores muito diferentes e não parece bom.

Sei que no 5.0 você pode usar, Window.setStatusBarColor()mas ActionBarActivitynão possui isso.

então minha pergunta é na versão 5.0, como posso alterar a cor da barra de status ActionBarActivity?

tyczj
fonte
Você já tentou usar o SystemBarTint lib? github.com/jgilfelt/SystemBarTint
Nikola Despotoski 4/04

Respostas:

420

Não sei se entendi o problema.

Se você deseja alterar a cor da barra de status programaticamente (e desde que o dispositivo tenha o Android 5.0), você pode usá-lo Window.setStatusBarColor(). Não deve fazer diferença se a atividade é derivada de Activityou ActionBarActivity.

Apenas tente:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.BLUE);
}

Apenas testei isso ActionBarActivitye funciona bem.


Nota: A configuração do FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSsinalizador programaticamente não é necessária se o values-v21arquivo de estilos já tiver sido definido, via:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
matiash
fonte
1
ah ok eu não estava usandogetWindow()
tyczj
isso trava quando o código LOLLIPOP não é encontrado em andróides antigos. é melhor usar> = 21
código511788465541441 17/11
12
@ code578841441 Na verdade, isso não deveria acontecer. As constantes são incorporadas ao compilar.
Matiash
4
@ code578841441: Isso é porque você está compilando com um SDK mais antigo. Você deve sempre se esforçar para compilar com o SDK do Android mais recente, mesmo se tiver restrições de versão de API mais antigas (ou seja, minSdkVersione / ou targetSdkVersionatributos no <uses-sdk ...>elemento).
dbm
3
Eu também tive que chamar getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); para torná-lo trabalho
Philipp E.
61

Existem várias maneiras de alterar a cor da barra de status.

1) Usando o styles.xml. Você pode usar o atributo android: statusBarColor para fazer isso da maneira mais fácil, mas estática.

Nota: Você também pode usar este atributo com o tema Material.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) Você pode fazer isso dinamicamente usando o método setStatusBarColor (int) na classe Window. Mas lembre-se de que esse método está disponível apenas para a API 21 ou superior. Certifique-se de verificar isso ou o seu aplicativo certamente trava nos dispositivos inferiores.

Aqui está um exemplo de trabalho desse método.

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

em que primaryDark é o tom 700 da cor principal que estou usando no meu aplicativo. Você pode definir essa cor no arquivo colors.xml.

Tente e me avise se tiver alguma dúvida. Espero que ajude.

Aritra Roy
fonte
parece window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); não é necessário - mas este trabalhou para mim
bkurzius
Alguma idéia de por que a versão programática funcionaria, mas a versão estilo não?
Andrew
No meu caso, o estilo da atividade tinha o flah translucent_status definido, portanto, sem o comando window.clearFlags, não funcionou. Então, obrigado por isso!
BMacedo
Oh uau! Essa resposta deve ser aceito, adicione clearFlagscorrigir o meu problema
fanjavaid
9

Não acho que a cor da barra de status tenha sido implementada no AppCompat ainda. Estes são os atributos que estão disponíveis:

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

(De \ sdk \ extras \ android \ suporte \ v7 \ appcompat \ res \ values ​​\ attrs.xml )

JstnPwll
fonte
1
É possível que nunca seja implementado no AppCompat se as versões mais antigas do sistema operacional não fornecerem a capacidade de modificar a barra de status.
theit
2
<attr name = "colorPrimaryDark" format = "color" /> <! - Variante escura da cor da marca principal. Por padrão, essa é a cor aplicada à barra de status (via statusBarColor) e à barra de navegação (via navigationBarColor). ->
Soheil Setayeshi
3

Tente isso, usei isso e funciona muito bem com a v21.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>
Manoj Kumar
fonte
1

Obrigado pelas respostas acima, com a ajuda delas, após determinadas pesquisas e desenvolvimento do aplicativo xamarin.android MVVMCross, abaixo funcionou

Sinalizador especificado para atividade no método OnCreate

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

Para cada MvxActivity, o Tema é mencionado abaixo

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

Meu SplashStyle.xml é como abaixo

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

E eu tenho V7 appcompact referido.

Pallavi
fonte
1

[Versão Kotlin] Criei esta extensão que também verifica se a cor desejada tem contraste suficiente para ocultar a interface do sistema, como ícone de status da bateria, relógio, etc.

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
    var flags: Int = window.decorView.systemUiVisibility // get current flags
    var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    var setSystemUILight = lightSystemUI

    if (setSystemUILight == null) {
        // Automatically check if the desired status bar is dark or light
        setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
    }

    flags = if (setSystemUILight) {
        // Set System UI Light (Battery Status Icon, Clock, etc)
        removeFlag(flags, systemLightUIFlag)
    } else {
        // Set System UI Dark (Battery Status Icon, Clock, etc)
        addFlag(flags, systemLightUIFlag)
    }

    window.decorView.systemUiVisibility = flags
    window.statusBarColor = color
}

private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0

private fun addFlag(flags: Int, flagToAdd: Int): Int {
    return if (!containsFlag(flags, flagToAdd)) {
        flags or flagToAdd
    } else {
        flags
    }
}

private fun removeFlag(flags: Int, flagToRemove: Int): Int {
    return if (containsFlag(flags, flagToRemove)) {
        flags and flagToRemove.inv()
    } else {
        flags
    }
}
Julián Falcionelli
fonte
0

Aplicando

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

in Theme.AppCompat.Light.DarkActionBarnão funcionou para mim. Qual foi o truque, dando colorPrimaryDarkcomo de costume junto com android:colorPrimarystyles.xml

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

e na configuração

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Window window = this.Window;
                    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                }

não precisou definir a cor da barra de status no código.

Annu
fonte