Navigation gaveta semi- transparente sobre barra de status não está funcionando

? Boardy @ | Original: StackOverFlow
---

Eu estou trabalhando em projeto Android e estou implementando o Drawer Navigation . Estou a ler através do novo http://www.google.com/design/spec/patterns/navigation-drawer.html eo http://android-developers.blogspot.co.uk/2014/10/material-design -em - android- checklist.html . A especificação diz que o slide out painel deve flutuar acima de tudo o resto, incluindo a barra de status e ser semi- transparente sobre a barra de status .

Meu painel de navegação é através da barra de status, mas o seu não tem qualquer transparência. Eu segui o código a partir deste post SO como sugerido no local desenvolvedores blog, link do Google acima http://stackoverflow.com/questions/26440879/how-do-i-use-drawerlayout-to-display-over-the-actionbar-toolbar-and-under-the-st/26440880 .

Abaixo está o meu layout XML

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_drawer_layout"
    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.v7.widget.Toolbar
            android:id="@+id/my_awesome_toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/appPrimaryColour" />
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout"
        android:layout_width="304dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:fitsSystemWindows="true"
        android:background="#ffffff">
        <ListView android:id="@+id/left_drawer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"></ListView>
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

Abaixo está o meu tema aplicativos

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/appPrimaryColour</item>
        <item name="colorPrimaryDark">@color/appPrimaryColourDark</item>
        <item name="colorAccent">@color/appPrimaryColour</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionModeOverlay">true</item>

    </style>

Abaixo está o meu tema aplicativos v21

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/appPrimaryColour</item>
    <item name="colorPrimaryDark">@color/appPrimaryColourDark</item>
    <item name="colorAccent">@color/appPrimaryColour</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Abaixo está o meu método onCreate

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    mDrawerLayout = (DrawerLayout)findViewById(R.id.my_drawer_layout);
    mDrawerList = (ListView)findViewById(R.id.left_drawer);

    mDrawerLayout.setStatusBarBackgroundColor(
        getResources().getColor(R.color.appPrimaryColourDark));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        LinearLayout linearLayout = 
            (LinearLayout)findViewById(R.id.linearLayout);
        linearLayout.setElevation(30);
    }

Abaixo está uma imagem da minha gaveta de navegação que mostra a parte superior não é semi transparente

Navigation gaveta semi- transparente sobre barra de status não está funcionando

---

Top 5 Responder

1mroczis @

Tudo que você precisa fazer é usar um pouco de cor semi- transparente para barra de status. Adicione as seguintes linhas ao tema v21 :

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

Não se esqueça que color (recurso) deve estar no formato #AARRGGBB . Isto significa que a cor também incluirá o valor alfa .

2Michele La Ferla @

Por que não usar algo semelhante a isto ?

<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

    <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#80111111"/>
</android.support.v4.widget.DrawerLayout>
3markus-hi @

Você precisa quebrar o layout de navegação dentro de uma gaveta ScrimLayout .

A ScrimLayout basicamente desenha um retângulo semi- transparente sobre seu layout gaveta navegação. Para recuperar o tamanho da inserção simplesmente substituir fitSystemWindows em seu ScrimLayout .

@Override
protected boolean fitSystemWindows(Rect insets) {
    mInsets = new Rect(insets);
    return true;
}

Override Later onDraw para desenhar um retângulo semi- transparente.

um https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java aplicação podem ser encontradas na fonte de Google IO App .  https://github.com/google/iosched/blob/master/android/src/main/res/layout/navdrawer.xml você pode ver como ele é usado no xml layout.

4fdsilva @

Eu tinha um recurso semelhante para implementar no meu projeto . E para tornar minha gaveta transparente eu só uso o http://stackoverflow.com/questions/5445085/understanding-colors-in-android-6-characters/11019879#11019879 . Usando 6 dígitos hexadecimais, você tem 2 dígitos hexadecimais para cada valor de vermelho, verde e azul, respectivamente . mas se você colocar dois dígitos adicionais (8 dígitos hexadecimais ), então você tem ARGB (dois dígitos para o valor alpha) ( http://stackoverflow.com/questions/5445085/understanding-colors-in-android-6-characters/11019879#11019879 ) .

Aqui estão os valores Hex Opacidade: para os 2 dígitos adicionais

100% — FF

95% — F2

90% — E6

85% — D9

80% — CC

75% — BF

70% — B3

65% — A6

60% — 99

55% — 8C

50% — 80

45% — 73

40% — 66

35% — 59

30% — 4D

25% — 40

20% — 33

15% — 26

10% — 1A

5% — 0D

0% — 00

Por exemple: se você tem cor hex de (# 111111 ) basta colocar um dos valores de opacidade para obter transparência. como este: (# 11111100 )

Minha gaveta não cobre a barra de ação ( como a sua ), mas a transparência pode ser aplicada nestes casos, também . Aqui está o meu código:

     <ListView
          android:id="@+id/left_drawer"
          android:layout_width="240dp"
          android:layout_height="match_parent"
          android:layout_gravity="start"
          android:background="#11111100"
          android:choiceMode="singleChoice"
          android:divider="@android:color/transparent"
          android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

E aqui está outra http://stackoverflow.com/questions/15852122/hex-transparency-in-colors que podem ajudá-lo a entender os códigos alfa em cores hexadecimais.

5xip @

Seu fundo barra de status é branco, o fundo da sua gaveta LinearLayout . Por quê? Está configurações fitsSystemWindows = "true" para o seu DrawerLayout eo LinearLayout dentro dela. Isso faz com que o seu LinearLayout para expandir atrás da barra de status (que é transparente) . Assim, fazendo o fundo para a parte gaveta do branco barra de status.

" __rsm__ " Se você não quer que sua gaveta para estender por trás da barra de status ( quer ter um fundo semi- transparente para toda a barra de status), você pode fazer duas coisas:

1) Você pode simplesmente remover o valor do fundo de seu LinearLayout e colorir o fundo do seu conteúdo dentro dela. ou

2) Você pode remover fitsSystemWindows="true" de seu LinearLayout . Penso que esta é uma abordagem mais lógica e mais limpo. Você também vai evitar ter uma sombra sendo lançado sob a barra de status, onde sua gaveta de navegação não se estende .

" __rsm__ " Se você quer que sua gaveta para estender por trás da barra de status e ter um, barra de status sobreposição de porte semi- transparente, você pode usar um https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java como um recipiente para o seu conteúdo gaveta ( ListView ) e definir o plano de fundo da barra de status usando app:insetForeground="#4000" . Claro, você pode mudar #4000 para qualquer coisa que você quiser. Não se esqueça de manter fitsSystemWindows="true" aqui!

Ou, se você não pretende sobrepor o seu conteúdo e exibir apenas uma cor sólida, você pode apenas definir o plano de fundo do seu LinearLayout a qualquer coisa que você quiser. Não se esqueça de definir o plano de fundo do seu conteúdo separadamente embora!

Navigation gaveta semi- transparente sobre barra de status não está funcionando