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.
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
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);
}
}
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());
}
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) :)
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
};
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.