90 votes

Comment faire en sorte que le tiroir de navigation s'ouvre de droite à gauche ?

Tout d'abord, je sais que cette question est déjà apparue ici, mais après avoir essayé plusieurs fois, je n'ai toujours pas réussi. Je travaille sur l'exemple de Site des développeurs Android .

J'essaie de configurer le menu pour qu'il s'ouvre de droite à gauche au lieu de la façon dont il est mis en œuvre dans l'exemple (de gauche à droite). En outre, je veux déplacer le bouton d'ouverture du menu sur le côté droit de la barre d'action. Je retrouve également quelques réponses ici, par exemple dans cette réponse .

J'essaie de modifier la gravité des vues et des mises en page mais j'obtiens l'erreur suivante :

aucune vue de tiroir trouvée avec gravité absolue GAUCHE

Pouvez-vous m'aider à comprendre quel est le problème dans mon code et ce que je dois changer pour que le menu s'ouvre par la droite et que le bouton de la barre d'action soit déplacé vers la droite ?

le code xml est ici :

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_gravity="right"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layoutDirection="rtl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <ListView android:id="@+id/left_drawer"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="10dp"
        android:background="#111"/>

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

157voto

Rudi Points 1095

Dans votre mise en page principale, définissez votre ListView de la gravité à la droite :

android:layout_gravity="right" 

Aussi dans votre code :

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item != null && item.getItemId() == android.R.id.home) {
            if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                mDrawerLayout.closeDrawer(Gravity.RIGHT);
            } 
            else {
                mDrawerLayout.openDrawer(Gravity.RIGHT);
            }
        }
        return false;
    }
};

J'espère que cela fonctionnera :)

66voto

Amir Bax Points 711

Ajoutez ce code au manifeste :

<application android:supportsRtl="true">

et ensuite écrire ce code sur Oncreate :

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

Cela fonctionne pour moi. ;)

40voto

Vladimir Kulyk Points 148

SOLUTION


votre_layout.xml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="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"
    android:fitsSystemWindows="true"
    tools:openDrawer="end">

    <include layout="@layout/app_bar_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        app:itemTextColor="@color/black"
        app:menu="@menu/activity_root_drawer" />

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

VotreActivité.java :

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
toolbar = (Toolbar) findViewById(R.id.toolbar);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT)) {
                drawer.closeDrawer(Gravity.RIGHT);
            } else {
                drawer.openDrawer(Gravity.RIGHT);
            }
        }
    });
//...
}

5voto

Cette réponse est utile pour définir l'ouverture de la navigation de droite à gauche, mais il n'y a pas de solution pour définir son icône à droite. Ce code peut le réparer. Si vous lui donnez le drawer comme premier paramètre et ViewCompat.LAYOUT_DIRECTION_RTL comme deuxième paramètre, la disposition entière sera définie comme RTL. C'est une solution rapide et simple, mais je ne pense pas qu'elle puisse être une solution correcte pour ceux qui veulent seulement configurer le menu pour qu'il soit ouvert de droite à gauche et configurer son icône pour qu'elle soit sur le côté droit. (Bien que cela dépende de votre objectif.) Cependant, je suggère de donner à la balise toolbar au lieu de la drawer . De cette façon, seule la barre d'outils est devenue RTL. Donc je pense que la combinaison de ces 2 réponses peut exactement faire ce que vous voulez.

D'après ces descriptions, votre code devrait être le suivant :

(Ajouter ces lignes à la méthode onCreate)

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // Set it final to fix the error that will be mention below.

    ViewCompat.setLayoutDirection(toolbar, ViewCompat.LAYOUT_DIRECTION_RTL);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT))
                drawer.closeDrawer(Gravity.RIGHT);
            else
                drawer.openDrawer(Gravity.RIGHT);
        }
    });

Notez que vous devez rendre le tiroir final, sinon vous obtiendrez cette erreur :

La variable 'tiroir' est accessible à partir de la classe interne, elle doit être déclarée finale

Et n'oubliez pas d'utiliser end au lieu de start sur onNavigationItemSelected méthode :

drawer.closeDrawer(GravityCompat.END);

et dans votre activité_main.xml

<android.support.v4.widget.DrawerLayout 
   android:id="@+id/drawer_layout"
   tools:openDrawer="end">

   <android.support.design.widget.NavigationView
      android:id="@+id/nav_view"
      android:layout_gravity="end"/>
</android.support.v4.widget.DrawerLayout>

3voto

KickAss Points 828

Voici la documentation sur le tiroir et il apparaît que vous pouvez le configurer pour qu'il s'ouvre à gauche ou à droite.

Le positionnement et la disposition du tiroir sont contrôlés à l'aide de l'attribut Android:layout_gravity sur les vues enfant correspondant au côté de la vue d'où vous voulez que le tiroir émerge : gauche ou droite. (Ou début/fin sur les versions de la plate-forme qui prennent en charge la direction de la disposition).

http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X