2013-05-16 5 views
20

Per il menu scorrevole di jfeinstein10 (https://github.com/jfeinstein10/SlidingMenu), è possibile scorrere in qualsiasi punto dell'app per aprire il menu.Toccare ovunque per scorrere il menu aperto per il cassetto di navigazione

Per Google il nuovo cassetto di navigazione http://developer.android.com/design/patterns/navigation-drawer.html#side-nav, esiste un modo per avere un comportamento simile?

Finora, dalla documentazione, ho visto che limitava solo lo scorrimento dal bordo o toccando l'icona dell'app.

L'utente può portare il cassetto navigazione sullo schermo scorrendo dal bordo sinistro dello schermo o toccando l'icona dell'applicazione nella barra delle operazioni.

+0

cercando di fare lo stesso thing..I vorrebbe impostare un margine che potrebbe essere trascinato ad aprire, simile a SlidingMenu. Ho postato qui http://stackoverflow.com/questions/16988597/set-drag-margin-for-android-navigation-drawer – Patrick

risposta

9

Ho trovato una soluzione. Puoi configurare il margine di tocco e ingrandirlo quanto lo è la tua vista. Ecco il link

Set drag margin for Android Navigation Drawer

+1

hack non funziona davvero soprattutto quando il suo contenuto è ViewPager. Quando scorri verso sinistra, con NavigationDrawer, ViewPager non cambierà dalla vista 0 alla vista 1. Tutti gli eventi sono consumati da NavigationDrawer. –

2

si potrebbe usare un GestureDetector per rilevare i gesti di scorrimento se stessi e basta aprire il cassetto di navigazione da soli, usando il metodo DrawerLayout.openDrawer().

+1

Sì, ci ho pensato, ma non è l'ideale. Invece del trascinamento graduale che segue il dito, semplicemente aprirà il cassetto immediatamente. Idealmente vorrebbe lo stesso comportamento di default (altrimenti andrò probabilmente per qualcosa come l'implementazione SlidingMenu) – bbedward

+1

Come finalmente Google ha trovato una soluzione standard per questo tipo di elemento di navigazione, penso che lo farebbe - almeno per il bene di coerenza - essere il migliore per usarlo come previsto dai suoi produttori. Se hai davvero bisogno che la tua app si comporti in un modo diverso, probabilmente dovresti usare SlidingMenu o qualcosa di simile, invece di cercare di piegare DrawerLayout in un modo per cui non è progettato. – Ridcully

+0

Suoni a destra, sembra uno SlidingPaneLayout potrebbe essere più di quello che sto cercando. – bbedward

10

Google, dal loro modo di dire il loro tutorial "Se l'utente tocca il margine sinistro dello schermo (entro 20 dp da sinistra)", sembra che non vogliono quella funzionalità.

Vedi http://developer.android.com/design/patterns/navigation-drawer.html

"L'utente può portare il cassetto di navigazione sullo schermo facendo scorrere dal bordo sinistro dello schermo o toccando l'icona dell'applicazione nella barra delle operazioni."

Non dicono o strisciare da qualsiasi punto dello schermo. Inoltre non hanno tale funzionalità in una qualsiasi delle loro applicazioni (G +, Gmail, ecc), quindi se si vuole che la funzionalità si dovrebbe probabilmente bastone con la scrittura del proprio (con gesti) o di terzi (ad es. Jfeinstein10).

EDIT: L'app di YouTube ti consente di scorrere ovunque ma la versione che ho almeno (4.5.17) non sembra che stia usando la loro nuova API.

+4

Questo. Ora che esiste un modello di design ufficiale, è meglio seguirlo. Gli utenti si abitueranno al modo ufficiale di gestire i cassetti di navigazione e si aspetteranno che tutte le app seguiranno. – Teovald

2

Come altri hanno detto, e Cheney ha detto nella sua risposta - è probabilmente meglio lasciarlo come previsto. Tuttavia, lo DrawerLayout è uno stile diverso da SlidingMenu. Google ha anche aggiunto SlidingPaneLayout che corrisponde più strettamente allo stile di SlidingMenu.

Ho finito per implementare uno SlidingPaneLayout in questo modo, in quanto era più di quello che stavo cercando, dopo tutto. (Questo è anche lo stile delle app YouTube/Hangouts)

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

    <LinearLayout 
      android:id="@+id/left_pane" 
      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" 
     android:layout_weight="1"/> 

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

Poi per aprire con il pulsante della barra home azione:

getActionBar().setDisplayHomeAsUpEnabled(true); 
getActionBar().setHomeButtonEnabled(true); 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action buttons 
    switch(item.getItemId()) { 
     case android.R.id.home: 
      if (mPaneLayout.isOpen()) 
       mPaneLayout.closePane(); 
      else 
       mPaneLayout.openPane(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

è quindi possibile implementare un PanelSlideListener da gestire quando si scorrevole/aperto /chiuso.

vi suggerisco di leggere la serie di Adam Powell sul cassetto di navigazione troppo - parte 3 ottiene nell'uso di SlidingPaneLayout vs navigazione cassetto:

Parte 1-https://plus.google.com/+AdamWPowell/posts/2zi4DXd3jkm

Parte 2-https://plus.google.com/+AdamWPowell/posts/VdgexsZeXHW

Parte 3 - https://plus.google.com/+AdamWPowell/posts/8j2GVw72i1E

Parte 4-https://plus.google.com/+AdamWPowell/posts/TtBFUXhe5HU

5

È possibile utilizzare questo

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
Field mDragger = mDrawerLayout.getClass().getDeclaredField(
    "mLeftDragger");//mRightDragger or mLeftDragger based on Drawer Gravity 
mDragger.setAccessible(true); 
ViewDragHelper draggerObj = (ViewDragHelper) mDragger 
    .get(mDrawerLayout); 

Field mEdgeSize = draggerObj.getClass().getDeclaredField(
    "mEdgeSize"); 
mEdgeSize.setAccessible(true); 
int edge = mEdgeSize.getInt(draggerObj); 

mEdgeSize.setInt(draggerObj, edge * 3);