2015-06-08 5 views
16

sto usando la libreria di progettazione Android su API 22. vorrei:Design Library Android CoordinatorLayout, AppBarLayout e DrawerLayout

  1. hanno una barra degli strumenti e una DrawerLayout all'interno del quale v'è una RecyclerView
  2. hanno il DrawerLayout si trova sotto la barra degli strumenti; ad esempio, quando la barra degli strumenti è visibile, il contenuto principale del cassetto deve essere al di sotto di esso e il cassetto (a sinistra) dovrebbe essere anche sotto di esso in modo che quando è espanso, la barra degli strumenti sia ancora visibile
  3. avere la barra degli strumenti fuori dallo schermata quando la vista del riciclatore scorre verso il basso

È possibile? Ho problemi a sposare # 2 e # 3. Il modo in cui è ora è che la barra degli strumenti è sempre sopra il layout del cassetto, che copre la prima voce nel riciclatore e anche la parte superiore del cassetto sinistro. Qui è il mio file di layout (incompleto, ma che mostra la mia struttura):

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v4.widget.DrawerLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scrollbars="vertical" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center"/> 

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

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <Toolbar 
      android:layout_width="match_parent" 
      android:layout_height="?android:attr/actionBarSize" 
      app:layout_scrollFlags="scroll|enterAlways"/> 

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

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

Sembra però app del RecyclerView: layout_behavior = "@ string/appbar_scrolling_view_behavior" impostazione non ha effetto, perché una volta cancellato, il comportamento è lo stesso.

Ho provato ad aggiungere un RelativeLayout come figlio del CoordinatorLayout per definire che il cassetto si trova sotto la barra degli strumenti, ecc. Ma nulla sembra funzionare.

È ciò che sto cercando di ottenere con la libreria?

risposta

0

Dal developers' page:

DrawerLayout funge primo livello contenitore per il contenuto finestra che permette per interattivi vista "cassetto" per essere tirato fuori dal bordo della finestra.

Al primo tentativo, posizionare DrawerLayout come contenitore di livello superiore (ovvero il layout principale). Quindi posiziona il CoordinatorLayout qui sotto e vedi cosa succede.

Inoltre non è stato aggiunto il NavigationView. Si prega di verificare le istruzioni fondamentali here.

+0

So cosa succede, l'ho provato. Se inserisco la barra degli strumenti all'interno del contenuto principale di DrawerLayout (con RecyclerView), il cassetto coprirà la barra degli strumenti. Vorrei che il cassetto fosse sotto la barra degli strumenti. Altrimenti non vedrò la fantasia animazione dell'icona e della freccia dell'hamburger. Ma forse è il modo in cui ora, come tutte le nuove app (anche l'app Foto, ecc.) Hanno semplicemente il coperchio anche sulla barra degli strumenti? Non mi piace il modo in cui appare il drower standard, con l'intestazione che copre la barra degli strumenti, poiché sembra pesante, ma sembra essere lo standard. – wujek

+0

Non sto ancora utilizzando NavigationView poiché sto procedendo passo passo e sostituendo il codice personalizzato esistente con il codice della libreria e non sono ancora arrivato al cassetto. Ma non sono sicuro se posso usarlo - richiede un menu, cioè è statico ciò che può presentare, e il mio cassetto è fondamentalmente un RecyclerView le cui voci provengono da un database, il che significa che il suo contenuto è dinamico e completamente sconosciuto a compilare il tempo. Non so ancora se NavigationView supporti questo caso d'uso. – wujek

+0

Il nuovo NavigationView è pensato per andare fino in cima, inclusa la barra di stato. Se vuoi che si mostri più in basso, aggiungi i margini vuoti nella parte superiore. – radley

3

Sì! È possibile.

<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/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/coordinatorLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context=".StartupActivity"> 

     <android.support.design.widget.AppBarLayout 
      android:id="@+id/appBarLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/app_bar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:layout_scrollFlags="scroll|enterAlways" 
       app:theme="@style/Theme.AppCompat.NoActionBar"/> 

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

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/scrollRecyclerView" 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      /> 

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

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/drawer_recycler_view" 
     android:layout_width="320dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="left|start" 
     android:background="@color/WhiteColor" 
     android:fitsSystemWindows="true" 
     android:scrollbars="vertical"/> 

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

Come si può vedere, ciò che conta è fondamentalmente di impostare app:layout_scrollFlags="scroll|enterAlways" per la vostra barra degli strumenti per nascondere quando si scorre. Lo RecyclerView nella parte inferiore del codice è quello all'interno dello DrawerLayout, quello sopra è quello nel layout dell'attività principale.

11

Provare quanto segue se si desidera vedere l'animazione dell'icona e della freccia dell'hamburger. Se includi il margine superiore (layout_marginTop) per NavigationView, verrà spostato verso il basso.

<?xml version="1.0" encoding="utf-8"?> 

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

    <android.support.design.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/main_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/appbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:layout_scrollFlags="scroll|enterAlways" /> 

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

     <!-- main content view --> 
     <FrameLayout 
      android:id="@+id/content_frame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@android:color/background_light" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

    <!-- The navigation drawer --> 
    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="?attr/actionBarSize" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:menu="@menu/drawer_menu"/> 

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

Prova questo dovrebbe funzionare, ha funzionato per me.

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

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      > 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:layout_scrollFlags="scroll|enterAlways" 
       /> 

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

     <android.support.v4.widget.DrawerLayout 
      android:id="@+id/drawer_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      > 
      <android.support.v7.widget.RecyclerView 
       android:id="@+id/scrollingRecyclerView" 
       android:layout_width="match_parent" 
       android:layout_height="fill_parent" 
     /> 

      <!-- The navigation drawer --> 
      <FrameLayout 
       android:id="@+id/right_frame" 
       android:layout_height="match_parent" 
       android:layout_gravity="start"/> (whatever) 

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

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

comportamento scorrimento deve essere impostato il figlio diretto di CoordinatorLayout (a DrawerLayout).Questo dovrebbe risolvere i tuoi problemi # 2, # 3. E nel caso in cui il contenuto del tuo cassetto contenga recyclerView , la barra degli strumenti verrà nuovamente spostata fuori dallo schermo.

0

È passato molto tempo ma credo che aiuti ancora qualcuno. Il layout del cassetto deve avere un layout figlio. Secondo i documenti android, deve essere FrameLayout perché l'ordine XML implica l'ordine z e il cassetto deve essere in cima al contenuto. Visita sotto il link.

Creating a Navigation Drawer

Aggiungi la tua AppBarLayout, Toolbar, RecyclerView e tutte le altre viste in FrameLayout e ne fanno un figlio di cassetto Layout. Spero che funzionerà.