2015-12-24 23 views
6

Ho un'attività con un Navigation Drawer e utilizzando ScrimInsetsFrameLayout Sono riuscito a mettere il layout sotto lo StatusBar e tutto ha funzionato perfettamente. Quindi ho deciso di sostituire il colore per Toolbar e StatusBar con uno sfondo png per tutto il layout dell'attività. Eseguo l'app sull'emulatore (Nexus 5 con Android 6.0) e il risultato era esattamente quello che volevo, come si può vedere in Immagine n. 1 qui sotto, ma quando ho provato sul mio dispositivo (Galaxy Note 3 con Android 5.0) il layout all'interno di ScrimInsetsFrameLayout è andato sopra lo StatusBarImmagine n. 2. Non riesco a capire cosa c'è che non va, puoi aiutarmi?Impossibile mettere DrawerLayout in StatusBar

Ecco la mia e la mia values-v21activity.xml

<style parent="Theme.AppCompat.Light.NoActionBar" name="AppTheme_Activities"> 

    <item name="android:colorPrimary">@android:color/transparent</item> 
    <item name="android:colorPrimaryDark">@color/insetF</item> 
    <item name="android:navigationBarColor">@color/insetF</item> 
    <item name="android:colorAccent">@color/primary</item> 
    <item name="android:colorEdgeEffect">@color/primary</item> 
    <item name="android:windowTranslucentStatus">true</item> 
    <item name="android:statusBarColor">@color/insetF</item> 
    <item name="android:windowTranslucentNavigation">true</item> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 

</style> 



<?xml version="1.0"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:id="@+id/drawer" 
    android:fitsSystemWindows="true" 
    android:background="@drawable/background"> <!--png image--> 

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

     <include layout="@layout/toolbar_activities" android:id="@+id/toolbar_layout"/> 

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

     </FrameLayout> 

    </FrameLayout> 

    <com.example.myapplication.ScrimInsetsFrameLayout 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/linearLayout" 
     android:layout_width="304dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:insetForeground="#4000" 
     android:clickable="true" 
     android:background="#ffffff"> ..... 

    </com.example.myapplication.ScrimInsetsFrameLayout> 

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

Immagine # 1 enter image description here

Immagine # 2 enter image description here

+0

quello che se si imposta la 'Android: fitsSystemWindows' del' ScrimInsetsFrameLayout' false? – Apostrofix

+0

Il DrawerLayout semplicemente non si estende sotto lo statusBar – Pier

+0

Controlla questo link: http://stackoverflow.com/questions/26440879/how-do-i-use-drawerlayout-to-display-over-the-actionbar-toolbar- e-under-the-st/26440880 potrebbe aiutarti. – Srikanth

risposta

2

enter image description here

  1. aggiungere alla vostra onCreate() di Activity

    getWindow().getDecorView().setSystemUiVisibility(
          View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
    
  2. Change ScrimInsetsFrameLayout s' android:fitsSystemWindows struttura al false

  3. Rimuovere android:fitsSystemWindows="true" da DrawerLayout

    <android.support.v4.widget.DrawerLayout 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:app="http://schemas.android.com/apk/res-auto" 
        android:layout_height="match_parent" 
        android:layout_width="match_parent" 
        android:id="@+id/drawer" 
        android:background="@drawable/background"> <!--png image--> 
    
        <FrameLayout 
         android:orientation="vertical" 
         android:layout_height="match_parent" 
         android:layout_width="match_parent"> 
    
         <include layout="@layout/toolbar_activities" android:id="@+id/toolbar_layout"/> 
    
         <FrameLayout 
          android:layout_height="match_parent" 
          android:layout_width="match_parent" 
          android:id="@+id/content_frame"> 
    
         </FrameLayout> 
    
        </FrameLayout> 
    
        <com.example.myapplication.ScrimInsetsFrameLayout 
         xmlns:app="http://schemas.android.com/apk/res-auto" 
         android:id="@+id/linearLayout" 
         android:layout_width="304dp" 
         android:layout_height="match_parent" 
         android:layout_gravity="start" 
         android:fitsSystemWindows="false" 
         app:insetForeground="#4000" 
         android:clickable="true" 
         android:background="#ffffff"> ..... 
    
        </com.example.myapplication.ScrimInsetsFrameLayout> 
    
    </android.support.v4.widget.DrawerLayout> 
    
  4. Aggiungi questi stili nel vostro AppTheme_Activities Theme (mantenendo lo stato di colore desiderato):

     <item name="windowActionBarOverlay">false</item> 
         <item name="android:windowActionBarOverlay">false</item> 
         <item name="android:fitsSystemWindows">false</item> 
         <item name="android:statusBarColor">#4000</item> 
    
  5. Questa volontà allo stato, che Toolbar prende sotto la StatusBar troppo, quindi avrai bisogno per fare questo hack:

    • Marchio s' Toolbar height = "wrap_content"

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

      Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
      setSupportActionBar(toolbar); 
      toolbar.setPadding(0, getStatusBarHeight(), 0, 0); 
      ...... 
      ...... 
      public int getStatusBarHeight() { 
          int result = 0; 
      
          if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
           int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
           if (resourceId > 0) { 
            result = getResources().getDimensionPixelSize(resourceId); 
           } 
          } 
          return result; 
      } 
      

Ecco dovrebbe essere!

Ho caricato il codice sorgente del test-applicazione con navigazione cassetto sotto la barra di stato al mio set - feel free to check it out.

ho risposto domanda abbastanza simile qualche tempo fa - forse si sarà anche essere utile: Translucent StatusBar with dynamic ActionBar color in Android

spero, aiuta

+0

L'ho fatto ma ora ho uno StatusBar trasparente – Pier

+0

@Pier e quale colore dovrebbe essere? –

+0

Ho impostato _ @ color/insetF_ che è il colore trasparente di _app: insetForeground = "_ ** # 4000 ** _" _ – Pier

1

ho avuto lo stesso problema, Pier. La cosa fastidiosa non sembra essere una guida decente su come risolvere questo problema, anche se fa parte delle linee guida sul design dei materiali, ecc.

In ogni caso, ecco come l'ho fatto ...


Stili

mio styles.xml contiene un tema base e poi il mio tema principale dell'applicazione. Ho creato un altro tema per le mie attività che utilizzano un cassetto di navigazione in questo modo:

<style name="Base.AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="android:windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 
</style> 

<style name="AppTheme" parent="Base.AppTheme"> 
    <item name="colorPrimary">@color/theme_primary</item> 
    <item name="colorPrimaryDark">@color/theme_primary_dark</item> 
    <item name="colorAccent">@color/theme_accent</item> 
</style> 

<style name="AppTheme.NavDrawer"> 
    <item name="android:windowBackground">@color/window_background</item> 
</style> 

Il colore window_background fa riferimento il mio colors.xml file, che elenca come #FFF5F5F5. Nota, quanto sopra funziona in modo leggermente diverso per API 21+, quindi nella directory values-v21, crea un altro styles.xml. Questo dovrebbe includere la seguente:

<style name="AppTheme.NavDrawer"> 
    <item name="android:windowBackground">@color/window_background</item> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
    <item name="android:statusBarColor">@android:color/transparent</item> 
</style> 

layout

Ora, per i layout. Nel file di layout avrai il cassetto di navigazione, puoi includere quanto segue.

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

    <!-- The main content view --> 
    <RelativeLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <android.support.design.widget.CoordinatorLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_above="@+id/main_adView"> 

      <!-- The app bar --> 
      <android.support.design.widget.AppBarLayout 
       android:fitsSystemWindows="true" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" > 
       <android.support.v7.widget.Toolbar 
        android:id="@+id/main_toolbar" 
        style="@style/AppTheme.Toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        app:layout_scrollFlags="scroll|enterAlways"/> 
      </android.support.design.widget.AppBarLayout> 

      <!-- Your layout content below --> 
      <FrameLayout 
       android:id="@+id/your_content" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
     </android.support.design.widget.CoordinatorLayout> 

     <!-- Other stuff here if you like --> 

    </RelativeLayout> 

    <!-- The navigation drawer --> 
    <include layout="@layout/navdrawer" 
     android:id="@+id/main_navigationView" /> 

Ovviamente è possibile rimuovere il RelativeLayout se non è necessario alcun altre viste al suo interno, come sarebbe ridondante. Il cassetto di navigazione ho fatto riferimento nel mio tag <include> è inferiore:

<android.support.design.widget.NavigationView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="match_parent" 
    android:layout_width="@dimen/navdrawer_width" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/navdrawer_header" 
    app:menu="@menu/navdrawer_items" /> 

Con il codice di cui sopra, si dovrebbe avere il cassetto di navigazione in modo corretto disegno dietro la barra di stato.

+0

Purtroppo ho lo stesso problema. Mi piacerebbe sapere se si tratta di un problema di stile o di layout ... quando ho usato i colori per _android: colorPrimary_ e per _android: colorPrimaryDark_ tutto era ottimo – Pier

+0

@Pier, penso che se il livello API minimo è impostato sotto 21 allora dovresti usare 'colorPrimary' (per essere compatibile con i dispositivi più vecchi), ma se stai facendo la tua app per API 21+, allora puoi usare' android: colorPrimary'. Per essere onesti, penso che nel complesso il problema sia risolto dalle modifiche sia nello stile che nei layout. –

+0

Ho _colorPrimary_ per _styles.xml_ nella cartella _values_ e _android: colorPrimaryDark_ per _styles.xml_ in _values-v21_ – Pier