web-dev-qa-db-fra.com

pousser l'activité vers la droite quand le tiroir est ouvert

J'ai mis en place une tiroir qui glisse depuis la droite mais cela ne décale pas l'activité comme le fait Facebook (voir l'image ci-dessous). Comment puis-je pousser l'activité en cours sur le côté droit lorsque l'utilisateur appuie sur le bouton Opendrawer comme dans l'image ci-dessus.Actuellement, il apparaît au-dessus de l'activité et laisse tomber l'ombre.J'apprécie vraiment toute aide. Merci d'avance.

 enter image description here

37
jason

Je ne pense pas que vous puissiez l'implémenter avec le stock DrawerLayout, cependant avec SlidingMenu vous pouvez, le dépôt GitHub devrait expliquer ici tout ce dont vous avez besoin

9
panini

Bien qu'il n'existe aucun moyen par défaut de faire glisser l'activité avec le tiroir de navigation, nous pouvons le faire via le code. Comme suggéré dans la réponse ci-dessus par mick88, voici l'extrait de code de mon projet.

mon fichier profile.xml

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:facebook="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <!-- Framelayout to display Fragments -->

    <RelativeLayout
        Android:id="@+id/mainView"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >


    </RelativeLayout>

    <!-- Listview to display slider menu -->

    <RelativeLayout
        Android:id="@+id/drawerView"
        Android:layout_width="240dp"
        Android:layout_height="wrap_content"
        Android:layout_gravity="start" >

        <ListView
            Android:id="@+id/list_slidermenu"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/list_background"
            Android:divider="@color/list_divider"
            Android:dividerHeight="1dp" />
    </RelativeLayout>
</Android.support.v4.widget.DrawerLayout>

maintenant en activité

public class ProfileActivity extends ActionBarActivity {
    ....
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;

    RelativeLayout drawerView;
    RelativeLayout mainView;
    ....

    @Override
    protected void onCreate(Bundle savedInstanceState) {


        ............. //
        .............//
        drawerView = (RelativeLayout) findViewById(R.id.drawerView);
        mainView = (RelativeLayout) findViewById(R.id.mainView);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.app_name, R.string.app_name) {
            public void onDrawerClosed(View view) {
                supportInvalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                supportInvalidateOptionsMenu();
            }

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
                mainView.setTranslationX(slideOffset * drawerView.getWidth());
                mDrawerLayout.bringChildToFront(drawerView);
                mDrawerLayout.requestLayout();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

    }

}
67
Suveer Jacob

Ceci n'est pas recommandé, mais vous pouvez déplacer votre mise en page par programme:

@Override
public void onDrawerSlide(View drawerView, float offset) {
    View container = findViewById(R.id.container);
    container.setTranslationX(offset * drawerView.getWidth());
}
25
mick88

Pour répondre à ta question. DrawerLayout se comporte comme prévu. 

Vous pouvez utiliser Slidingmenu (ou Umano ) en conjonction avec DrawerLayout (je le fais). 

Enfin, en ce qui concerne ce que vous voulez (et ce que fait Facebook), Google lui-même ne veut pas que vous fassiez cela. Ils souhaitent que vous utilisiez le tiroir comme ils le font dans Google Music (par exemple).

Un contact de Google m'a dit exactement ceci: 

  • Le tiroir de navigation doit suivre les nouvelles guidelines et être implémenté avec DrawerLayout et ActionBarDrawerToggle. 
  • Le tiroir de navigation ne doit pas déplacer la barre d’action et doit apparaître en superposition au-dessus du contenu de l’écran.
  • Le tiroir de navigation ne doit contenir que des éléments de navigation principaux. Évitez d'afficher dans le tiroir de navigation des éléments qui seraient généralement placés dans la barre d'action, tels que Paramètres ou Rechercher . Blockquote

Alors ne faites pas ce que Facebook fait. (C'est un bon conseil dans tout autre contexte) :)

8
Martin Marconcini

C'est vraiment utile. Mettez cet extrait dans votre MainActivity.Java

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
 @Override
 public void onDrawerSlide(View drawerView, float slideOffset) {
    super.onDrawerSlide(drawerView, slideOffset);
    containerFrame.setTranslationX(slideOffset * drawerView.getWidth());
    drawerLayout.bringChildToFront(drawerView);
    drawerLayout.requestLayout();
    //below line used to remove shadow of drawer
    drawerLayout.setScrimColor(Color.TRANSPARENT);
}//this method helps you to aside menu drawer
};
7
Ness Tyagi

OP a eu la réponse. Mais pour quelqu'un d'autre qui veut cet effet, vous pouvez utiliser SlidingPaneLayout . C'est conçu à cet effet. 

En fichier XML:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.SlidingPaneLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@id/mainFrame"
    style="@style/MP.mainFrame" >


    <!--****************************Right Pane ****************************-->
    <LinearLayout style="@style/searchLayout">
        <Android.support.v4.widget.NestedScrollView style="@style/MP">
            <LinearLayout style="@style/MP.verticalLinearLayout">


            </LinearLayout>
        </Android.support.v4.widget.NestedScrollView>
    </LinearLayout>
    <!--****************************Right Pane ****************************-->

    <!--****************************Left Pane ****************************-->
<FrameLayout style="@style/MP.mainLayout">
    <LinearLayout Android:id="@id/fragmentContainer" style="@style/MP.fragmentContainer"/>

    <Android.support.v7.widget.Toolbar style="@style/toolbar">
        <ir.tooskar.excomponents.ExtendedTextView Android:id="@id/appTitle" style="@style/WC.appTitle"/>
        <ir.tooskar.excomponents.ExtendedTextView Android:id="@id/appBarSearchIcon" style="@style/WC.appBarSearchIcon"/>
    </Android.support.v7.widget.Toolbar>
</FrameLayout>        <!--****************************Left Pane ****************************-->

Il y a deux panneaux, droit et gauche, collent ensemble et bougent donc ensemble. Pour moi, le volet de gauche est le volet principal et la droite est masquée avec une icône en forme de bascule pour l’afficher. (Une vue avec id appBarSearchIcon).

N'oubliez pas qu'il existe un viewgroup nommé, SlidingPaneLayout qui n'a que deux enfants, Left et The Right.

Et partie importante de l'activité:

        slidingPaneLayout = (SlidingPaneLayout) findViewById(R.id.mainFrame);
//        Sets a color for covering left pane(Main Pane)
        slidingPaneLayout.setSliderFadeColor(ContextCompat.getColor(context, R.color.searchPaneFadeColor));

//        The listener for Opening the Right pane(Hidden pane)
        findViewById(R.id.appBarSearchIcon).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view){
                slidingPaneLayout.openPane();
            }
        });

La fermeture du volet de droite est effectuée par l’API, tout comme le tiroir de navigation.

0
Arash