web-dev-qa-db-fra.com

Appuyez n'importe où pour faire glisser le menu ouvert du tiroir de navigation

Pour le menu coulissant de jfeinstein10 ( https://github.com/jfeinstein10/SlidingMen ), je peux glisser n'importe où dans l'application pour ouvrir le menu.

Pour le tiroir de navigation récemment introduit par Google http://developer.Android.com/design/patterns/navigation-drawer.html#side-nav , est-il possible que je puisse avoir un comportement similaire?

Jusqu'à présent, d'après la documentation, je n'ai vu que la limite de glisser depuis Edge ou de toucher l'icône de l'application.

L'utilisateur peut afficher le tiroir de navigation sur l'écran en faisant glisser le doigt depuis le bord gauche de l'écran ou en touchant l'icône de l'application sur la barre d'action.

22
Cheok Yan Cheng

J'ai trouvé une solution. Vous pouvez configurer la marge de toucher et la rendre aussi large que votre vue. Voici le lien

Définir la marge de glissement pour Android Tiroir de navigation

10
Maxim Efimov

Google, d'après la façon dont ils écrivent leur tutoriel "Si l'utilisateur touche le bord tout à fait gauche de l'écran (à moins de 20 dp à partir de la gauche)", semble ne pas vouloir cette fonctionnalité.

Voir http://developer.Android.com/design/patterns/navigation-drawer.html

"L'utilisateur peut afficher le tiroir de navigation sur l'écran en faisant glisser le doigt depuis le bord gauche de l'écran ou en touchant l'icône de l'application dans la barre d'action."

Ils ne disent ni ne glissent de n'importe où sur l'écran. Ils n'ont pas non plus cette fonctionnalité dans aucune de leurs applications (G +, Gmail, etc.), donc si vous voulez cette fonctionnalité, vous devriez probablement vous en tenir à l'écriture de votre propre (avec des gestes) ou d'un tiers (par exemple. Jfeinstein10).

EDIT: L'application Youtube vous permet de glisser n'importe où, mais la version que j'ai au moins (4.5.17) ne semble pas utiliser leur nouvelle api.

10
Cheney Hester

Vous pouvez utiliser ceci

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

Comme d'autres l'ont dit, et Cheney l'a dit dans sa réponse - il est probablement préférable de laisser les choses comme prévu. Cependant, le DrawerLayout est un style différent du SlidingMenu. Google a également ajouté SlidingPaneLayout qui correspond plus étroitement au style de SlidingMenu.

J'ai fini par implémenter un SlidingPaneLayout de cette façon, car c'était plus ce que je cherchais après tout. (C'est également le style de l'application 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>

Ensuite, pour ouvrir avec le bouton d'accueil de la barre d'action:

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

Vous pouvez ensuite implémenter un PanelSlideListener pour gérer le glissement/l'ouverture/la fermeture.

Je suggère de lire également la série d'Adam Powell sur le tiroir de navigation - la partie 3 traite de l'utilisation de SlidingPaneLayout vs Navigation Drawer:

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

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

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

Partie 4 - https://plus.google.com/+AdamWPowell/posts/TtBFUXhe5H

3
bbedward

Vous pouvez utiliser GestureDetector pour détecter vous-même les mouvements de glissement et ouvrir simplement le tiroir de navigation vous-même en utilisant la méthode DrawerLayout.openDrawer() .

2
Ridcully