17

sto cercando di disegnare vista dietro la barra di stato in questo modo: Desired resultCoordinatorLayout non disegno dietro barra di stato anche con windowTranslucentStatus e fitsSystemWindows

ho cercato di produrre questo effetto con le tecniche consigliate, ma ottengo questo:

Actual result

E 'chiaro dallo screenshot che nessuno dei miei contenuti app è in corso di elaborazione dietro la barra di stato.

La cosa interessante è che in qualche modo, il Nav cassetto riesce a disegnare dietro la barra di stato:

enter image description here

roba che ho fatto:

  • Usa libreria di supporto widget - CoordinatorLayout, AppBarLayout, Toolbar , DrawerLayout
  • windowTranslucentStatus impostato su true nel mio a pp tema
  • fitsSystemWindows insieme al true sul mio CoordinatorLayout

Questa è la mia app tema:

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

    <item name="android:windowTranslucentStatus">true</item> 
</style> 

Questo è il mio layout di attività:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <FrameLayout android:id="@+id/page_container" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:fitsSystemWindows="true"/> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer" /> 

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

Il FrameLayout nel mio layout di attività viene sostituito con questo layout del frammento:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".MainActivity"> 

    <FrameLayout android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin" 
       android:paddingTop="@dimen/activity_vertical_margin" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       android:background="@android:color/holo_blue_bright" 
       tools:context=".MainActivity"> 

     <TextView android:text="@string/lorem_ipsum" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
    </FrameLayout> 

    <android.support.design.widget.AppBarLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     app:elevation="0dp" 
     android:theme="@style/AppTheme.TransparentAppBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="@android:color/transparent" 
      app:title="@string/hello_blank_fragment" 
      app:popupTheme="@style/AppTheme.OverflowMenu" /> 

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

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@android:drawable/ic_dialog_email" /> 

</android.support.design.widget.CoordinatorLayout> 
+0

Provare a configurare fitsSystemWindows = "false" sul layout del cassetto. – natario

+0

@mvai Ho appena provato e non sembra cambiare nulla – Joshua

+0

Ho avuto un problema simile, prova questo: http: // StackOverflow.it/questions/34761671/translucent-transparent-status-bar-coordinatorlayout-toolbar-fragment/37713319 # 37713319 – milechainsaw

risposta

22

modifica per futuri lettori: ci sono un sacco di buone informazioni sull'argomento e il problema anche sui commenti, assicurati di leggerli.

risposta originale: Il tuo tema è sbagliato, ecco perché. Sfortunatamente, ci sono differenze su come attivare in Kitkat o Lollipop. Sul mio codice l'ho fatto in Java, ma puoi anche realizzarlo in XML se vuoi giocare con le cartelle V21 nell'albero delle risorse. Il nome dei parametri sarà molto simile alle controparti Java.

Eliminare il android:windowTranslucentStatus dal vostro XML e Java usano così:

public static void setTranslucentStatusBar(Window window) { 
     if (window == null) return; 
     int sdkInt = Build.VERSION.SDK_INT; 
     if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) { 
     setTranslucentStatusBarLollipop(window); 
     } else if (sdkInt >= Build.VERSION_CODES.KITKAT) { 
     setTranslucentStatusBarKiKat(window); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    private static void setTranslucentStatusBarLollipop(Window window) { 
     window.setStatusBarColor(
      window.getContext() 
        .getResources() 
        .getColor(R.color./add here your translucent color code /)); 
    } 

    @TargetApi(Build.VERSION_CODES.KITKAT) 
    private static void setTranslucentStatusBarKiKat(Window window) { 
     window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
    } 

quindi è possibile chiamare dalla vostra attività setTranslucentStatusBar(getWindow());

edit:

rendendo la barra di stato traslucida e disegnare dietro di esso (per qualche motivo non riesco a capire) sono due compiti separati in Android.

Ho guardato di più sul mio codice e sono sicuro di avere MOLTO di più android:fitsSystemWindows="true" sul mio layout rispetto al solo CoordinatorLayout.

qui sotto sono tutte le viste sul mio layout con android:fitsSystemWindows="true" su di loro:

  • CoordinatorLayout
  • AppBarLayout
  • CollapsingToolbarLayout
  • ImageView (l'immagine di sfondo con)
  • FrameLayout (con il contenuto dell'intestazione)

quindi il mio suggerimento è di provare/provare a riempire android:fitsSystemWindows="true" sul tuo XML.

+1

La tua tecnica rimuove lo sfondo scuro della tinta di la barra di stato, ma continua a non lasciare che il mio 'CoordinatorLayout 'riempia l'area dietro la barra di stato. Ora sembra questo: http://i.imgur.com/koMgcm0.png?1 – Joshua

+0

controlla la mia risposta modificata. – Budius

+1

Mi dispiace dire che applicare 'fitsSystemWindows' a tutto ciò non ha funzionato. Ho anche provato ad aggiungere un CollapsingToolbarLayout con un ImageView al mio layout di frammento con 'fitsSystemWindows', ma non ha funzionato neanche. Seriamente, grazie per il tuo aiuto. Penso che dovrò provare alcune soluzioni non ortodosse. – Joshua

0

Questo è stato davvero confusa per me, ma alla fine ho capito che per il mio combinazione di punti di vista che si presenta così:

<android.support.v4.widget.SwipeRefreshLayout - **no fitsSystemWindow set** 

<android.support.design.widget.CoordinatorLayout- android:fitsSystemWindows="true" 

<android.support.design.widget.AppBarLayout - android:fitsSystemWindows="true" 

<android.support.design.widget.CollapsingToolbarLayout - android:fitsSystemWindows="true" 

<RelativeLayout - android:fitsSystemWindows="true" 

<ImageView - android:fitsSystemWindows="true" 

Ho anche usato i metodi pubblicati da Budius nella mia app per ottenere la barra di stato trasparente di lavoro:

Eliminare l'androide: windowTranslucentStatus dal vostro XML e in Java usa così:

public static void setTranslucentStatusBar(Window window) { 
     if (window == null) return; 
     int sdkInt = Build.VERSION.SDK_INT; 
     if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) { 
     setTranslucentStatusBarLollipop(window); 
     } else if (sdkInt >= Build.VERSION_CODES.KITKAT) { 
     setTranslucentStatusBarKiKat(window); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    private static void setTranslucentStatusBarLollipop(Window window) { 
     window.setStatusBarColor(
      window.getContext() 
        .getResources() 
        .getColor(R.color./add here your translucent color code /)); 
    } 

    @TargetApi(Build.VERSION_CODES.KITKAT) 
    private static void setTranslucentStatusBarKiKat(Window window) { 
     window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
    } 
0

se voglio disegnare dietro StatusBar Io uso CoordinatorLayout come più genitore vista di attività (Android: fitsSystemWindows = "false")

Se voglio StatusBar da transluent e simultanieousy vista kepping lontano da Hidding dietro StatusBar I utilizzare come la maggior parte genitore vista FrameLayout con argomento

<FrameLayout 
    ... 
    android:fitsSystemWindows="true"> 
</FrameLayout> 

mio styles.xml (V21) assomigliare

<resources> 

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

    <style name="AppTheme.NoStatusBar" parent="AppTheme.NoActionBar"> 
     <item name="android:windowTranslucentStatus">true</item> 
     <item name="android:windowTranslucentNavigation">true</item> 
     <item name="windowActionBarOverlay">true</item> 
     <item name="android:windowActionBarOverlay">true</item> 
    </style> 
</resources> 

E styles.xml

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

Forse il punto chiave qui è di essere sicuri di utilizzare AppCompactActivity così come si usa Theme.AppCompact come root per i tuoi stili.

0

fitsSystemWindows aggiunge il riempimento alla parte superiore della vista in modo che non venga nascosto sotto la barra di stato. Rimuovere fitsSystemWindows e sarà dietro di esso.