Navigazione cassetto semi - trasparente sopra la barra di stato non funziona

? Boardy @ | Original: StackOverFlow

Sto lavorando al progetto Android e io sono l'attuazione della navigazione cassetto . Sto leggendo attraverso il nuovo http://www.google.com/design/spec/patterns/navigation-drawer.html e http://android-developers.blogspot.co.uk/2014/10/material-design -on -android - checklist.html . La specifica dice che la diapositiva riquadro dovrebbe galleggiare sopra tutto il resto tra cui la barra di stato e di essere semi- trasparente sopra la barra di stato .

Il mio pannello di navigazione è sopra la barra di stato, ma la sua non ha alcuna trasparenza . Ho seguito il codice di questo SO posto come suggerito nel sviluppatori blog spot, Link Google qui sopra http://stackoverflow.com/questions/26440879/how-do-i-use-drawerlayout-to-display-over-the-actionbar-toolbar-and-under-the-st/26440880 .

Di seguito è riportato il mio 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>

Qui di seguito è la mia app tema

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

Qui di seguito è il mio tema apps 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>

Qui di seguito è il mio metodo 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);
    }

Qui di seguito è uno screenshot del mio cassetto navigazione che mostra la parte superiore non è semi trasparente

Navigazione cassetto semi - trasparente sopra la barra di stato non funziona



Top 5 Respuesta

1mroczis @

Tutto quello che dovete fare è usare un pò di colore semi - trasparente per la barra di stato . Aggiungere queste righe al tema V21 :

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

Non dimenticate che color ( risorse) deve essere in formato #AARRGGBB . Ciò significa che il colore comprenderà anche il valore alfa .



2Michele La Ferla @

Perché non usare qualcosa di simile a questo ?

<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 @

Hai bisogno di avvolgere il layout cassetto di navigazione all'interno di un ScrimLayout .

Un ScrimLayout disegna sostanzialmente un rettangolo semi - trasparente sopra il layout del cassetto di navigazione . Per recuperare la dimensione del riquadro semplicemente ignorare fitSystemWindows nel vostro ScrimLayout .

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

Override tardi onDraw per disegnare un rettangolo semitrasparente .

un https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java implementazione può essere trovato nella fonte Google IO App .  https://github.com/google/iosched/blob/master/android/src/main/res/layout/navdrawer.xml si può vedere come viene utilizzato nel xml layout.

4fdsilva @

Ho avuto una funzione simile a implementare nel mio progetto . E per rendere il mio cassetto trasparente mi basta usare il http://stackoverflow.com/questions/5445085/understanding-colors-in-android-6-characters/11019879#11019879 . Utilizzando 6 cifre esadecimali, si hanno 2 cifre esadecimali per ogni valore di rosso, verde e blu, rispettivamente . ma se si mette due cifre supplementari (8 cifre esadecimali ), in modo da avere ARGB ( due cifre per il valore alpha ) ( http://stackoverflow.com/questions/5445085/understanding-colors-in-android-6-characters/11019879#11019879 ) .

Qui ci sono i valori esadecimali Opacità : per le 2 cifre supplementari

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

Per Esempio : se si dispone di colore esadecimale de ( # 111111 ) basta mettere uno dei valori di opacità per ottenere la trasparenza . in questo modo : ( # 11.111.100 )

Il mio cassetto non copre la barra delle azioni ( come la tua ), ma la trasparenza può essere applicato in questi casi anche . Ecco il mio codice :

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

Ed ecco un altro http://stackoverflow.com/questions/15852122/hex-transparency-in-colors che possono aiutare a capire i codici alfa in colori esadecimali.

5xip @

La vostra barra di stato sfondo è bianco, lo sfondo del vostro cassetto LinearLayout . Perché ? Siete Impostazioni fitsSystemWindows = " true " per il vostro DrawerLayout e LinearLayout suo interno . Questo fa sì che il vostro LinearLayout per espandere dietro la barra di stato ( che è trasparente ) . Così, rendendo lo sfondo per la parte cassetto del bianco barra di stato .

" __rsm__ " Se non si desidera che il cassetto per estendere dietro la barra di stato ( vogliono avere un fondo semi- trasparente per l'intera barra di stato ), si possono fare due cose :

1 ) Si può semplicemente rimuovere qualsiasi valore di fondo dal LinearLayout e colorare lo sfondo del contenuto al suo interno . o

2 ) È possibile rimuovere fitsSystemWindows="true" dal tuo LinearLayout . Penso che questo sia un approccio più logico e più pulito . Potrai anche evitare di avere un'ombra di essere gettato sotto la barra di stato, in cui il cassetto di navigazione non si estende .

" __rsm__ " Se volete che il vostro cassetto per estendere dietro la barra di stato e hanno un semi - trasparente, barra di stato di dimensioni overlay, è possibile utilizzare un https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java come contenitore per il contenuto del cassetto ( ListView ) e impostare lo sfondo barra di stato con app:insetForeground="#4000" . Naturalmente, è possibile cambiare #4000 per tutto quello che vuoi . Non dimenticate di tenere fitsSystemWindows="true" qui !

Oppure, se non si vuole sovrapporre i tuoi contenuti e visualizzare solo un colore solido, si può solo impostare lo sfondo del vostro LinearLayout per tutto quello che vuoi . Non dimenticate di impostare lo sfondo del vostro contenuti separatamente però!

Navigazione cassetto semi - trasparente sopra la barra di stato non funziona