A barra de status fica branca e não mostra o conteúdo por trás dela

96

Estou testando o AppCompat no Marshmallow. E eu quero ter uma barra de status transparente, porém ela fica branca. Tentei algumas soluções, mas não funcionaram para mim ( barra de status transparente não funciona com windowTranslucentNavigation = "false" , Lollipop: desenhe atrás de statusBar com sua cor definida como transparente ). Aqui está o código relacionado.

Meus estilos.xml

<style name="Bacon" parent="Theme.Bacon"/>

<style name="Theme.Bacon" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@color/background_material_light</item>  
</style>

<style name="Theme.Bacon.Detail" parent="Bacon"/>

v21

<style name="Bacon" parent="Theme.Bacon">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

<style name="Theme.Bacon.Detail" parent="Bacon">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Atividade

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

</FrameLayout>

Fragmento

<android.support.design.widget.CoordinatorLayout 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="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="32dp"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/black_trans80">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/photo"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/anim_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

insira a descrição da imagem aqui

pt2121
fonte
Você consegue resolver este problema? Estou tendo o mesmo problema. Em uma das minhas atividades tendo barra de status branca
kirtan403
1
@ kirtan403 Resolvi meu problema mudando o layout de minha atividade de FrameLayout para RelativeLayout. Por favor, veja minha resposta.
pt2121
O meu é relativo apenas ainda recebendo a barra de status branca. Eu postei a pergunta aqui: stackoverflow.com/q/33890066/1820644
kirtan403
Depois de lutar por um dia, encontrei a solução que funcionou para mim. Aqui está a resposta: stackoverflow.com/a/33892569/1820644
kirtan403
Alterei o status do android: windowTranslucentStatus para false e está funcionando
Kiran Benny Joseph

Respostas:

167

Encontrei a resposta neste link: A cor da barra de status não muda com o layout relativo como elemento raiz

Então, precisamos remover o

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

em styles.xml (v21). E funciona muito bem para mim.

Phoenix Wang
fonte
Sim, esta é a solução. Porque android: fitSystemWindows causará problemas ao tornar a barra de guias rolável. Encontrou a mesma resposta, mas você postou antes. Mencione também que isso é sobrescrito padrão, eu acho.
jobbert
Isso deve ser marcado como a solução aceita. Esse problema estava surgindo em todo o meu aplicativo, essa solução o corrigiu em todos os lugares apenas comentando aquela única linha. Me salvou de tanta dor de cabeça!
BMB
Estou usando o CoordinatorLayout, então a outra resposta para nós, CoordinatorLayout como raiz, não funciona para mim (usar fitSystemWindows = true como sugerido também não funcionou). Essa resposta funciona para mim.
Bruce
E se eu exigir que a cor da minha barra de status seja transparente?
nullmn
1
@nullmn então você precisa mudar o fundo da sua Atividade para outra coisa.
Phoenix Wang
96

(Um pouco tarde para a festa, mas pode ajudar alguém)

Eu tive o mesmo problema. De alguma forma, algumas atividades estavam normais, enquanto as novas que criei exibiam uma barra de status branca em vez de um colorPrimaryDarkvalor.

Depois de tentar várias dicas, percebi que as atividades normais de trabalho eram todas usando CoordinatorLayoutcomo raiz do layout, enquanto para as outras eu tinha trocado por layouts regulares porque não precisava dos recursos (animação, etc) fornecidos pelo CoordinatorLayout.

Portanto, a solução é fazer CoordinatorLayouto layout raiz e, dentro dele, adicionar a raiz do layout anterior. Aqui está um exemplo:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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="match_parent"
  android:fitsSystemWindows="true">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <!-- your activity content here-->


  </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

POR FAVOR, NOTE que sem android:fitsSystemWindows="true"essa solução não funciona para mim.

Testado em Lollipop e Marshmallow

Mauro Banze
fonte
3
A solução funcionou para mim também. Mas .. por que isso acontece? A cor adequada do StatusBar é exibida quando a raiz é DrawerLayout ou CoordinatorLayout
user3316561
3
Isso só funcionou para mim quando adicionar android:fitsSystemWindows="true"ao CoordinatorLayoutno Android 8.
Franco
2
@Franco acho que essa é a parte mais relevante da solução. Digo isso porque tive CoordinatorLayoutquando tive o mesmo problema e a propriedade específica que corrigiu isso para mim foiandroid:fitsSystemWindows="true"
Wilhelm
O android:fitsSystemWindows="true"não funcionou para mim. O que resolveu meu problema é usar um tema que não está AppTheme.NoActionBarna atividade com a CoordinatorLayout. Não sei por que isso consertou.
bmdelacruz
CoordinatorLayoutou android:fitsSystemWindows="true"nenhum está funcionando para mim.
Alif Hasnain
17
 <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style

Basta substituir isso, statusBarColor deve ser a cor esperada e não TRANSPARENTE

Shrini Jaiswal
fonte
17

Você tem que adicionar esta propriedade ao seu estilo para ver o conteúdo

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>
Andres Paez
fonte
Isso funcionou para mim. Esta deve ser a resposta aceita.
abdul rehman
11

Adicione isso em seu style.xml

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

e isso em seu onCreate ();

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Michele Lacorte
fonte
1
Obrigado, mas isso não funciona. A barra de status parece a mesma.
pt2121
por favor me ajude com este problema ... mesmo problema aqui .... nenhuma das soluções até agora funciona
Saeed Jassani
@SaeedJassani Encontrei uma solução que funcionou para mim. Se você tiver o mesmo problema, dê uma olhada na minha pergunta e resposta: stackoverflow.com/a/33892569/1820644
kirtan403
9

Depois de tentar sem sucesso todas as opções acima, descobri que definir explicitamente o tema corrigiu o problema.

setTheme(R.style.AppTheme);

Isso deve vir antes do super.OnCreate () em sua atividade.

James Britton
fonte
1
Posso confirmar que isso corrige a atividade
errônea
te amo cara, funcionou como um encanto, embora eu ainda não tenha idéia do porquê: @
Adeel Ahmad
antes do super.OnCreate () é a chave
Karthik Rk
9

Basta colocar este item em seu v21 \ styles.xml:

verdade

Deve ser assim:

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

Rami
fonte
1
Funcionou para mim usar falsevalores nos últimos 2 itens. Estranho, mas obrigado.
JCarlosR
Ele funciona apenas com as duas últimas linhas, mas o conteúdo está atrás da barra de status, preenchimento / margem ou fitSystemWindows não ajuda. Testado em OP 5 executando nougat
Anton Makov
9

Eu enfrentei o mesmo problema. O que fiz foi, no arquivo "v21 / styles.xml", alterar o valor true:

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

para:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>
Degomos
fonte
7
<item name="android:statusBarColor">@android:color/transparent</item>

Você verá essa linha de código em values ​​/ styles / styles.xml (v21). Remova-o e isso resolverá o problema

Link para esta resposta

Phares
fonte
5

Corrigi meu problema alterando o layout de minha atividade de FrameLayout para RelativeLayout. Obrigado a todos que tentaram ajudar!

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

    <android.support.v4.view.ViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/theme_primary_dark"
      android:fitsSystemWindows="true" />

</RelativeLayout>

Experimente o visualizador de hierarquia ou ViewInspector . Essas ferramentas podem ajudá-lo.

pt2121
fonte
5

Basta remover a seguinte tag do estilo v21 @android: color / transparent

Isso funciona para mim.

Shendre Kiran
fonte
@android: color / transparent não é uma "tag". Pode ser o valor de um atributo de estilo, mas não é uma "tag". E se o OP tiver esse valor definido mais de uma vez? Qual ele deve remover? Sua resposta é muito genérica.
protegido de
sim, foi o caso para mim também .. obrigado, Shendre! :) e para seu comentário, @protectedmember - o sistema operacional não tem gênero.
zeroDivider
3

Melhor abordagem

Verifique o arquivo style.xml onde está o tema NoActionBar. Certifique-se de que seu pai seja Theme.AppCompat.NoActionBar e também personalize-o adicionando seu esquema de cores. Por fim, defina seus temas no manifesto, conforme necessário.

Abaixo está uma amostra do meu arquivo styles.xml (ActionBar + NoActionBar).

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- No ActionBar application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
Nilesh Mahant
fonte
2

Para mim, funcionou da seguinte maneira:

  1. Defina o tema .NoActionBar
  2. Envolva a barra de ferramentas em android.support.design.widget.AppBarLayout
  3. Faça android.support.design.widget.CoordinatorLayoutcomo o layout pai.

Essencialmente, é a terceira etapa que desenha a barra de status, colorPrimaryDarkcaso contrário ela não será desenhada se você usar o NoActionBartema. A segunda etapa dará à barra de ferramentas essa sobreposição .

Priyankvex
fonte
2

Para estilos v23

 <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

Para estilos v21

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>
Ankit Aman
fonte
2

[Resultado]

Expanda res -> valores -> diretório de estilos do painel do projeto.

Abra styles.xml (v21)

USE QUALQUER UM DOS MENOS ABAIXO

  1. Altere verdadeiro para falso na android:windowDrawsSystemBarBackgroundspropriedade.
  2. Altere @android: color / transparent para @ color / colorPrimaryDark na android:statusBarColorpropriedade.
  3. Remova a android:statusBarColorlinha própria.
Ketan Ramani
fonte
2

Se o seu v21 / styles.xml contém

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

Em seguida, remova ou comente abaixo da linha ou mude a cor da barra de status,

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

Está funcionando bem. Espero que isso seja útil. Obrigado.

sahu
fonte
2

Eu encontrei uma solução para isso -

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>

adicione isso ao seu estilo e funcionará para API 21 ou superior.

being_sohelkhan
fonte
1

Não tenho certeza se é tarde, mas espero que ajude alguém. * Faça uma visão falsa com fundo transparente que se encaixa no layout e faça um layout de coordenador como seu elemento raiz do layout.

<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:fitsSystemWindows="true" />


<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/something" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   .... YOUR LAYOUT

Vahidlazio
fonte
1

Isso tem trabalho para mim

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
Valdemir Nunes de Freitas
fonte
1
Olá, bem-vindo ao StackOverflow! Você poderia editar sua resposta para explicar por que essa resposta funciona? Explicações curtas sobre seu código ajudam muito!
Gigazelle
0

Meu palpite é que isso é causado pelo seu android:windowBackground. É @color/background_material_lightuma referência ao branco?

hanspeide
fonte
Não. Definitivamente não é branco, mas obrigado mesmo assim! (Você pode ver os ícones brancos nele.)
pt2121
Eu interpretei mal sua pergunta. Tente substituir <item name="android:statusBarColor">@android:color/transparent</item>por <item name="android:statusBarColor">@null</item>.
hanspeide
Apenas para ter certeza de que entendi corretamente, deseja que a imagem seja exibida atrás da barra de status?
hanspeide,
0

Verifique se esta barra de ferramentas fica branca - a AppBar não é desenhada depois de rolar para fora da tela

https://code.google.com/p/android/issues/detail?id=178037#c19

Estou usando bibliotecas 23.0.0. e o bug ainda ocorre.

A solução alternativa para isso é adicionar uma Visualização que quase não ocupa espaço e pode ser invisível. Veja a estrutura abaixo.

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.Toolbar
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height=".3dp"
        android:visibility="visible"/>

</android.support.design.widget.AppBarLayout>

Estas perguntas no Stackoverflow.com também se referem a este bug: CoordinatorLayout Toolbar invisível ao entrar até a altura total AppBarLayout - Layout às vezes invisível depois de entrar na visualização (mesmo se não for inserido)

clickdroid
fonte
não é o mesmo bug. no meu caso, é branco logo após a exibição da atividade, não depois de rolar para fora da tela. obrigado mesmo assim
pt2121
0

Se você estiver usando RelativeLayout / CoordinatorLayout, esta é a solução que funcionou para mim:

Você tem que usar

  • CoordinatorLayout
  • AppBarLayout

Lembre-se de usar CoordinatorLayout em vez de RelativeLayout (o desempenho é melhor e funciona perfeitamente com AppBarLayout)

É assim que o seu fragmento deve começar

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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="match_parent"
android:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >
    ...

Boa codificação!

Faustino Gagneten
fonte
0
 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

adicione o item 'windowTranslucentStatus' em estilos

Sanjay
fonte
0

Adicione isso em seu style.xml

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

Nota: a coloração da barra de status não é compatível abaixo do nível 21 da API.

Raviraj
fonte
-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

Adicione essas 2 linhas no arquivo java abaixo

nitin kapsikar
fonte
1
Bem-vindo ao Stack Overflow. Você poderia explicar como sua parte do código funciona e como ela ajuda a resolver a questão dos OPs? Consulte como escrever uma boa resposta para melhorar sua resposta
Tom M