2013-05-16 4 views
20

Für das Schiebe-Menü von jfeinstein10 (https://github.com/jfeinstein10/SlidingMenu) kann ich überall in die App schieben, um das Menü zu öffnen.Tippen Sie auf eine beliebige Stelle, um das Menü für die Navigationsleiste zu öffnen.

Für Google neu eingeführt Navigationsschublade http://developer.android.com/design/patterns/navigation-drawer.html#side-nav, gibt es eine Möglichkeit, ich kann ähnliches Verhalten haben?

Bis jetzt, aus der Dokumentation, sah ich nur die Grenze von der Kante gleiten oder berühren Sie das App-Symbol.

Der Benutzer kann die Navigationsleiste auf den Bildschirm bringen, indem von der linken Kante des Bildschirms oder durch das Anwendungssymbol berühren in der Aktionsleiste wischen.

+0

versucht, das gleiche zu tun thing..I möchte eine Marge setzen, die gezogen werden könnte, um zu öffnen, ähnlich wie SlidingMenu. Ich postete hier http://StackOverflow.com/Questions/16988597/set-drag-margin-for-android-navigation-drawer – Patrick

Antwort

9

Ich habe eine Lösung gefunden. Sie können den Berührungsspielraum so konfigurieren, dass er so breit ist wie Ihre Ansicht. Hier ist der Link

Set drag margin for Android Navigation Drawer

+1

Hack funktioniert nicht wirklich, besonders wenn der Inhalt ViewPager ist. Wenn Sie mit NavigationDrawer nach links wischen, wechselt ViewPager nicht von Ansicht 0 zu Ansicht 1. Alle Ereignisse werden von NavigationDrawer verbraucht. –

2

könnten Sie eine GestureDetector verwenden, um sich Gesten zu erkennen, Schiebe- und öffnen Sie einfach die Navigationsleiste selbst die DrawerLayout.openDrawer() Methode.

+1

Ja, ich dachte darüber nach, aber das ist nicht ideal. Anstelle des allmählichen Ziehens, das Ihrem Finger folgt, öffnet es einfach die Schublade sofort. Idealerweise würde das gleiche Verhalten wie Standard (sonst würde ich wahrscheinlich für etwas wie die SlidingMenu-Implementierung gehen) – bbedward

+1

Da Google endlich eine Standardlösung für diese Art von Navigationselement kam, denke ich, dass es - zumindest für Konsistenz - sei das Beste, um es so zu verwenden, wie es von seinen Machern beabsichtigt ist. Wenn Sie Ihre App wirklich brauchen, um sich anders zu verhalten, sollten Sie wahrscheinlich SlidingMenu oder ähnliches verwenden, anstatt DrawerLayout auf eine Weise zu biegen, für die es nicht gedacht ist. – Ridcully

+0

Hört sich gut an, sieht aus wie ein SlidingPaneLayout könnte mehr von dem sein, was ich suche. – bbedward

10

Google, von der Art, wie sie ihr Tutorial schreiben "Wenn der Benutzer den äußersten linken Rand des Bildschirms berührt (innerhalb von 20 dp von links)", scheint diese Funktionalität nicht zu wollen.

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

„Der Benutzer kann durch Streichen von der linken Kante des Bildschirms oder durch Berühren des Anwendungssymbol in der Aktionsleiste in der Navigationsleiste auf den Bildschirm bringen.“

Sie sagen oder wischen nicht von irgendwo auf dem Bildschirm. Sie haben diese Funktionalität auch nicht in ihren Apps (G +, Gmail, etc.). Wenn Sie diese Funktionalität möchten, sollten Sie wahrscheinlich mit Ihrem eigenen (mit Gesten) oder einem Dritten (zB jfeinstein10) schreiben.

EDIT: Youtube App können Sie überall wischen, aber die Version, die ich mindestens (4.5.17) habe, sieht nicht so aus, als ob sie ihre neue API verwendet.

+4

Dies. Jetzt, wo es ein offizielles Designmuster gibt, ist es am besten, es zu befolgen. Die Benutzer werden sich an den offiziellen Umgang mit Navigationsschubladen gewöhnen und erwarten, dass alle Apps diesem folgen. – Teovald

2

Wie andere gesagt haben, und Cheney hat in seiner Antwort gesagt - es ist wahrscheinlich am besten, es wie beabsichtigt zu lassen. Die DrawerLayout ist jedoch ein anderer Stil als die SlidingMenu. Google fügte auch SlidingPaneLayout hinzu, das dem Stil von SlidingMenu genauer entspricht.

Ich endete damit, eine SlidingPaneLayout auf diese Weise zu implementieren, da es mehr von dem war, wonach ich schließlich suchte. (Dies ist auch der Stil des YouTube/Hangout-App)

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

Dann mit der Aktionsleiste Home-Taste öffnen:

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); 
    } 
} 

Sie dann eine PanelSlideListener implementieren zu handhaben, wenn es Schiebe-/offen /geschlossen.

Ich schlage vor, auch auf der Navigationsleiste Adam Powell Serie zu lesen - Teil 3 wird in Verwendung von SlidingPaneLayout vs Navigationsleiste:

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

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

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

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

5

Sie diese verwenden können

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